Код: Выделить всё
// Thread 1:
r1 = y.load(std::memory_order_relaxed); // A
x.store(r1, std::memory_order_relaxed); // B
// Thread 2:
r2 = x.load(std::memory_order_relaxed); // C
y.store(42, std::memory_order_relaxed); // D
Код: Выделить всё
AКроме того, что DI-код> выполняется. D виден в . [intro.excution] P8 говорит: < /p>
секвенировано перед тем, как асимметричная, переходная, парная связь между оценками, выполняемыми одним потоком < /strong> ([Intro.multithRead]), который индуцирует частичный порядок между этими оценками. Учитывая любые две оценки A и B, если A секвенированы перед B (или, эквивалентно, B секвенирует после A), то выполнение A должно предшествовать выполнению B .
. и b выполняются одним потоком. Это неправильно сделать вывод из обратного. То есть мы не можем сказать: если выполнение предшествующего выполнения B, то A секвенирует перед B таким образом, что A видно для B. С этого момента «переупорядочение» является бессмысленным. Я думаю, что это источник, который при упоминании «x выполняется», «подразумевает» y выполнен », люди интуитивно установили бы порядок между x и y из -за« применяется к исполнению, и приходит к выводу, что «y» происходит до «x». это требует контр-защитника. Например: < /p>
Код: Выделить всё
#include
#include
#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();
}
Если мы использовали «переупорядочение» или связали порядок с точки зрения стандарта ISO C ++ с выполнением выражений, это принесет некоторую путаницу. Например, Can #2 и #3 переупорядочение, которое, в свою очередь, необходимо рассмотреть, что #2 может переупорядочить по заказу в потенциально бесконечном цикле на #1 и т. Д.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -reasoning
Мобильная версия