Я прочитал документ std :: memory_order_relaxed .
Одна часть объяснения Расслабленный заказ - это ....
// Thread 1:
r1 = y.load(memory_order_relaxed); // A
x.store(r1, memory_order_relaxed); // B
// Thread 2:
r2 = x.load(memory_order_relaxed); // C
y.store(42, memory_order_relaxed); // D
и объяснение этому сказано ...
[Это] разрешено производить r1 == r2 == 42
. В частности, это может произойти, если D завершается до C в потоке 2, либо из-за переупорядочения компилятора, либо во время выполнения.
Я понял объяснение и попробую проверить на своем компьютере следующий код:
std::atomic<int> x = {0};
std::atomic<int> y = {0};
int r1, r2;
void task1() {
// Thread 1:
r1 = y.load(memory_order_relaxed); // A
x.store(r1, memory_order_relaxed); // B
}
void task2() {
// Thread 2:
r2 = x.load(memory_order_relaxed); // C
y.store(42, memory_order_relaxed); // D
}
int main()
{
std::thread t2 (task2);
std::thread t1 (task1);
t1.join();
t2.join();
cout << "r1: " << r1
<< "\nr2: " << r2 << endl;
return 0;
}
Результаты этого кода никогда r1 == r2 == 42
, что говорит о возможном поведении в этом документе.
Что-то не так в этом коде? Или есть какое-то недоразумение?