Определяется ли порядок побочного эффекта в порядке модификации тем, когда побочный эффект возникает?C++

Программы на C++. Форум разработчиков
Anonymous
Определяется ли порядок побочного эффекта в порядке модификации тем, когда побочный эффект возникает?

Сообщение Anonymous »

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

#include 
#include 
#include 
#include 
#include 
int main()
{
std::atomic flag = {false};
std::atomic val = {0};
std::thread t1([&](){
val.store(1,std::memory_order::relaxed);  // #1
flag.store(true,std::memory_order::relaxed);  // #2
});
std::thread t2([&](){
while(!flag.load(std::memory_order::relaxed)){}  // #3
auto r = val.exchange(2,std::memory_order::relaxed); // #4
assert(r!=0);  // #5
});
t1.join();
t2.join();
}
В этом примере #3 не синхронизируется с #2, однако он может гарантировать, что #1 уже произошел, когда #4 оценивается. Означает ли это, что порядок модификации val равен {0, 1, когда #4 оценивается так, что часть чтения этой операции чтения-изменения-записи гарантированно будет читать 1< /code> согласно [atomics.order] p10

Атомарные операции чтения-изменения-записи всегда должны считывать последнее значение (в порядке модификации), записанное ранее запись, связанная с операцией чтения-изменения-записи.

Гарантированно ли, что #5 в этом примере не сработает? В этом примере утверждение не срабатывает https://godbolt.org/z/G8KzK3o8W

Подробнее здесь: https://stackoverflow.com/questions/790 ... by-when-th

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