Смотрите, несколько продвинутый вопрос. Есть две функции, которые запускаются в двух потоках.
#include <atomic>
#include <thread>
#include <assert.h>
std::atomic<bool> x;
std::atomic<int> z;
void write() {
x.store(true, std::memory_order_release);
}
void get() {
if (x.load(std::memory_order_acquire)) {
++z;
}
}
int main() {
x = false;
z = 0;
std::thread a(write);
std::thread b(get);
a.join();
b.join();
assert(z.load() != 0);
}
При обычных обстоятельствах все вроде окей, но. Если случиться ситуация, что thread a запустится и сразу же прервется (т. е. менеджер потоков от OC не даст достаточно времени чтобы выполнилась эта операция записи, или ядро получит инструкцию прерывания и т.д.) А второй thread b запуститься как обычно. Получается, что x.load прочитает false (т.к. thread a не успел записать) и assert сработает. По-идеи никакие memory_order_seq_cst не спасут, ибо thread a не начнет данную инструкцию.
Какие есть пути отхода у вопроса? Понятно, что ситуация маловероятна, но нужно знать