Можно ли перезаписать атомарный выпуск? - PullRequest
0 голосов
/ 28 мая 2018

Скажите, у меня есть atomic<int> i; Поток A выполняет атомарное сохранение / обмен с memory_order_release.Затем поток B выполняет атомарное хранение с помощью memory_order_release.Поток C выполняет атомарный fetch_add (0, memory_order_acquire);

Получает ли поток C зависимости из потока A и B или только из потока B ?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Только B (Я собираюсь предположить, что под «следующим» вы подразумеваете, что порядок модификации атома равен A -> B -> C, так что под [atomics.order] p11 C 's RMW должен прочитать значение B писал).См. Примечание в [intro.races] p6 :

За исключением указанных случаев, чтение более позднего значения не обязательно обеспечивает видимость, как описано ниже.Такое требование иногда мешало бы эффективной реализации.

Часть чтения fetch_add - это операция получения, которая взяла свое значение из выпуска хранилища, поэтому выпуск хранилища синхронизируется с RMW с помощью [atomics.order] p2 :

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

Однако сохранение / освобождение, выполняемое потоком B, не является операцией RMW и, следовательно, не является частью последовательности освобождения, возглавляемойхранилище нити А (см. [intro.races] p5 ).Поэтому хранилище потока А не синхронизируется с fetch_add.

0 голосов
/ 29 мая 2018

edit: см. Ответ TC

, это оставляет только эту часть моего ответа:

Я бы настоятельно рекомендовал использовать атомы с их порядком памяти по умолчанию (memory_order_seq_cst), если у вас нетдействительно веская причина (измерить производительность), чтобы поступить иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...