Код: Выделить всё
std::atomic flag = false;
int arr[2] = {};
// thread 1:
arr[0] = 1; // A
flag.store(true,std::memory_order::relaxed); // B
// thread 2:
while(!flag.load(std::memory_order::relaxed)); // C
arr[1] = 2; // D
< /code>
Согласно [intro.execution] p8 < /p>
Указание каких -либо двух оценок a и b, если a секвенировано перед B (или, эквивалентно, B -последовательно после a), тогда выполнение A должно предшествовать выполнению b. < /p>
C, потому что c не происходит до того, как b , c может прочитать значение, написанное B , что петля выходит. Это подразумевает, что, если цикл выходит, b выполняется для создания побочного эффекта.
Аналогично, согласно [intro.excution] p8, выполнение должно предшествовать выполнению b . Это подразумевает, что, если B выполняется, тогда был выполнен .
Код: Выделить всё
D[*]
Код: Выделить всё
C[*]
Код: Выделить всё
BСуммировать все вышеуказанное, мы можем сделать вывод, что:
Код: Выделить всё
Dили, наоборот, это означает
, если не был выполнен, то d не выполняется. верно?
Подробнее здесь: https://stackoverflow.com/questions/797 ... two-thread
Мобильная версия