Я бился головой о стол, пытаясь найти ошибку параллелизма в следующем коде. Мой друг, я спорю об этом уже довольно давно, и мы не можем определить сценарий, в котором и 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