Код: Выделить всё
#include
#include
#include
#include
int main(){
std::atomic v{0};
int x = 0;
std::thread t1([&](){
x = 1;
v.exchange(1,std::memory_order::release); // #1
});
std::thread t2([&](){
int expected = 1;
while(!v.compare_exchange_strong(expected,3,std::memory_order::relaxed)){} // #2
v.fetch_sub(1,std::memory_order::relaxed); // #3
});
std::thread t3([&](){
int expected = 2;
while(!v.compare_exchange_strong(expected,10,std::memory_order::relaxed)){} // #4
assert(x ==1);
});
t1.join();
t2.join();
t3.join();
}
Последовательность освобождения, возглавляемая операцией освобождения A на атомарном объекте M — это максимальная непрерывная подпоследовательность побочных эффектов в порядке модификации M, где первой операцией является A, а каждая последующая операция — это атомарная операция чтения-изменения-записи.
В этом примере порядок изменения v — {0, 1, 3, 2,10, поскольку #4 читает значение, записанное #3 и #3 можно рассматривать в последовательности релизов, возглавляемой #1. Следовательно, утверждение никогда не завершается неудачей. Правильно ли это понимается?
Подробнее здесь: https://stackoverflow.com/questions/790 ... lationship