Могу ли я сделать вывод о взаимосвязи между двумя оценками в двух потоках таким образом?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Могу ли я сделать вывод о взаимосвязи между двумя оценками в двух потоках таким образом?

Сообщение Anonymous »

Рассмотрим этот пример: < /p>

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

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
секвенирована перед D , поэтому выполнение C должно предшествовать выполнению d . Это подразумевает, что, если d выполняется, C должен прочитать True , чтобы цикл выходил и завершает его выполнение. Модифицирует m, где B не происходит до A.

, потому что c не происходит до того, как b , c может прочитать значение, написанное B , что петля выходит. Это подразумевает, что, если цикл выходит, b выполняется для создания побочного эффекта.
Аналогично, согласно [intro.excution] p8, выполнение должно предшествовать выполнению b . Это подразумевает, что, если B выполняется, тогда был выполнен . выполняется -> c выходит
[*] Exits -> b выполняется
[*] выполняется -> a был выполнен

Суммировать все вышеуказанное, мы можем сделать вывод, что:
выполняется -> a был выполнен

или, наоборот, это означает

, если не был выполнен, то d не выполняется. верно? Однако этот вопрос не о порядке. Причина, по которой я ссылался [Intro.excution] P8, заключается в том, чтобы формально доказать, почему d недоступен, если цикл не выходит. и d выполняются отдельным потоком 2, и нет других потоков, которые бы выполняли бы C и d , поэтому в потоке 2, если цикл не выходит, то d не будет выполнен в соответствии с [Intro.excution] p8.
. true Если цикл выходит.
Единственная проблема с использованием «была выполнена». Как указано @petercordes, если нет дополнительных разъяснений, «выполнено» может привести к тому, что люди склонны интерпретировать его как разговор о порядке, порядок на временной шкале или порядок с точки зрения стандарта ISO C ++.

Подробнее здесь: https://stackoverflow.com/questions/797 ... two-thread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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