Код: Выделить всё
#include
#include
#include
int main(){
std::atomic v = 0;
std::atomic flag = false;
std::thread t1([&](){
while(!flag.load(std::memory_order::relaxed)){} // #1
assert(v.exchange(2,std::memory_order::relaxed) == 1); // #2
});
std::thread t2([&](){
if(v.exchange(1,std::memory_order::relaxed) == 0){ // #3
flag.store(true, std::memory_order::relaxed); // #4
}
});
t1.join();
t2.join();
}
< /code>
Простой способ доказать, что утверждение никогда не проходит,-это использовать противоположность. Цель состоит в том, чтобы доказать, что «если утверждение выполнено, условие в if The infinite loop can exit only if its condition loads true according to [stmt.while] p1 says:
In the while statement, the substatement is executed repeatedly until the value of the Условие ([[stmt.pre]) становится ложным.
то есть, должен существовать побочный эффект, который устанавливает флаг true , который управляется [Intro.races] p10
Некоторые неопределенные побочные эффекты A, который изменяет M, где B не происходит до A.
Побочный эффект может быть получен только с помощью оценки в #4 , и что оценка должна быть выполнена для создания побочного эффекта.
, как и сейчас, каждая шаг формального анализа соответствует формальному правилу. Тем не менее, я не могу найти соответствующее формальное правило, которое имеет отношение к «утверждению недоступно/не будет выполнено, если цикл не выходит», которое может получить следующее предложение вместе с вышеуказанными шагами:
, если утверждение было выполнено, условие в if true. Критический шаг в этом формальном противостоянии. Наконец, в соответствии с [atomics.order] p10 < /p>
Операции атомного чтения-модификации-записи всегда должны считывать последнее значение (в порядке модификации), написанного до записи, связанной с операцией по считыванию-модификации. 0 , поэтому RMW на #3 должен прочитать 2 , что приводит к тому, что условие является false , следовательно, предположение неверно.
Итак, где соответствующее правило о «утверждении недоступно/не будет выполнено, если цикл не выходит»?>
Подробнее здесь: https://stackoverflow.com/questions/797 ... onding-rul
Мобильная версия