Устанавливает ли последовательность релизов, возглавляемую RMW, отношения синхронизации?C++

Программы на C++. Форум разработчиков
Anonymous
 Устанавливает ли последовательность релизов, возглавляемую RMW, отношения синхронизации?

Сообщение Anonymous »

Код: Выделить всё

#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();
}
[intro.races] p5 говорит:

Последовательность освобождения, возглавляемая операцией освобождения A на атомарном объекте M — это максимальная непрерывная подпоследовательность побочных эффектов в порядке модификации M, где первой операцией является A, а каждая последующая операция — это атомарная операция чтения-изменения-записи.

В этом примере порядок изменения v — {0, 1, 3, 2,10, поскольку #4 читает значение, записанное #3 и #3 можно рассматривать в последовательности релизов, возглавляемой #1. Следовательно, утверждение никогда не завершается неудачей. Правильно ли это понимается?

Подробнее здесь: https://stackoverflow.com/questions/790 ... lationship

Вернуться в «C++»