Допустим, у нас есть 2 темы. Один производитель и один потребитель. У нас есть производитель, который производит данные, и потребитель, который использует эти данные. Однако охранник не атомный!
bool isDataReady = false;
int data = 0;
void Producer() {
data = 42;
std::atomic_thread_fence(std::memory_order_release);
isDataReady = true;
}
void Consumer() {
while(!isDataReady);
std::atomic_thread_fence(std::memory_order_acquire);
assert(data == 42);
}
Интересно, почему существует гонка данных на isDataReady
.
Обычно правильный код должен использовать порядок relaxed
для атомарной переменной bool.
Это потому, что запись (транзакция) в isDataReady может быть не завершена до чтения? И даже если это так, действительно ли это проблема?