Способствует ли порядок изменения отношениям «произойдет до»? - PullRequest
0 голосов
/ 21 февраля 2019
// Thread 1
// do A
x.store(1, std::memory_order_release); // operation1

// Thread 2
// do B
x.store(2, std::memory_order_release); // operation2

// Thread 3
x.load(std::memory_order_acquire); // operation3

Я понял, что если thread3 читает значение, записанное thread1, операции освобождения и получения выполняются синхронизированы с , а эффект A виден для thread3.
Но что, если дело в том, что:

  • порядок модификации для x равен 1, 2
  • thread3 читает значение, записанное thread2, таким образом, 2 происходит раньше 3.

Существует ли случаемо-до взаимосвязи между 1 и 3?
или, по сути, вносит ли порядок изменения в происшествие-до отношения?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Если я правильно понимаю ваш вопрос, нет никаких дополнительных гарантий по общему упорядочению в результате того, какой порядок упорядочения памяти вы используете.Нет никакой блокировки, чтобы это произошло.

0 голосов
/ 22 февраля 2019

Нет.связь между операцией 1 и операцией 3 не возникает -

с [atomics.order] / 2 :

атомарная операция A, выполняющаяоперация освобождения атомарного объекта M синхронизируется с атомарной операцией B, которая выполняет операцию получения для M и получает свое значение от любого побочного эффекта в последовательности освобождения, возглавляемой A.

... ик сожалению, операция 2 не находится в последовательности освобождения, возглавляемой операцией 1, в соответствии с [intro.races] / 5 :

последовательность освобождения, возглавляемая операцией освобождения A наатомарный объект M - это максимальная непрерывная подпоследовательность побочных эффектов в порядке модификации M, где первая операция - это A, , а каждая последующая операция - это атомарная операция чтения-изменения-записи .

В результате мы не можем построить взаимосвязь между потоками, возникающая до того, как между операцией 1 и другими операциями, поэтому случается-bПоэтому связь между Операцией 1 и Операцией 3.

0 голосов
/ 21 февраля 2019

В вашем примере вы показываете, что поток 1 и поток 2 работают с x совершенно одинаково.Следовательно, отношение между потоком 1 и потоком 3 должно быть точно таким же, как отношение между потоком 2 и потоком 3.

В вашем примере не показаны строки кода, которые могли бы ограничить порядокв котором три операции на самом деле произойдет.Другими словами, просто взглянув на эти три утверждения, невозможно сказать, вернется ли операция загрузки 1 или 2, или какое-то предыдущее значение x.

...