Предположим, что у меня есть 2 темы:переназначения атомарных операций в C++
int value = 0;
std::atomic<bool> ready = false;
thread 1:
value = 1
ready = true;
thread 2:
while (!ready);
std::cout << value;
эта программа может выводить 0?
Я прочитал о модели памяти C++ - в частности, последовательная согласованность, которая, по моему мнению, является дефолтом, и это было не особенно ясно. Требуется ли компилятору просто выполнять атомарные операции в правильном порядке относительно друг друга или требуется, чтобы атомарные операции были в правильном порядке относительно всех других операций?
Это немного сложнее, чем это: есть * в потоке * и * между потоками *, чтобы рассмотреть. В принципе, правила работают «как ожидалось», чтобы код был правильным и делает то, что вы думаете, что он должен делать. –
Для последовательной согласованности это очень похоже на барьер; вещи над ним не могут быть перегруппированы, чтобы идти дальше, а вещи ниже не могут быть перегруппированы, чтобы идти до него. Не имеет значения, являются ли другие значения атомарными или нет. В этом случае вы в порядке. – ShadowRanger