Состояние гонки в двух потокахC++

Программы на C++. Форум разработчиков
Anonymous
 Состояние гонки в двух потоках

Сообщение Anonymous »

Я бился головой о стол, пытаясь найти ошибку параллелизма в следующем коде. Мой друг, я спорю об этом уже довольно давно, и мы не можем определить сценарий, в котором и t1, и t2 обращаются к буферу одновременно. Мы предполагаем относительно простой планировщик только с одним ядром на процессоре 386.
Я убежден, что проверка и установка buffer_read_complete.load здесь неверна и требует буфер_read_complete.compare_exchange_weak. Я просто не могу рассуждать в крайнем случае, который приводит к одновременному доступу к буферу.
#include

void wcpy(char*);
void rcpy(char*);

static char buffer[256];
static std::atomic buffer_write_complete = false;
static std::atomic buffer_read_complete = true;

void t1() {
while (true) {
if (buffer_read_complete.load(std::memory_order_seq_cst)) {
buffer_read_complete.store(false, std::memory_order_seq_cst);
wcpy(buffer);
buffer_write_complete.store(true, std::memory_order_seq_cst);
}
}
}

void t2() {
while (true) {
if (buffer_write_complete.load(std::memory_order_seq_cst)) {
buffer_write_complete.store(false, std::memory_order_seq_cst);
rcpy(buffer);
buffer_read_complete.store(true, std::memory_order_seq_cst);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... wo-threads

Вернуться в «C++»