Только 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
.