Почему fetch_sub не является операцией релиза? - PullRequest
0 голосов
/ 24 мая 2018

Цитируется из Параллелизм C ++ в действии $ Листинг 5.9

Операция fetch_sub с семантикой memory_order_acquire не синхронизируется ни с чем, даже если она хранитзначение, потому что это не операция освобождения.Аналогично, хранилище не может синхронизироваться с fetch_or с семантикой memory_order_release, потому что часть чтения fetch_or не является операцией получения.

Мне трудно понять параграф выше.Если операция fetch_sub с семантикой memory_order_acquire не синхронизируется - ни с чем, почему интерфейс fetch_sub оставляет для нас параметр порядка памяти следующим образом?

T fetch_sub( T arg, std::memory_order order = std::memory_order_seq_cst ) noexcept;

1 Ответ

0 голосов
/ 24 мая 2018
  1. "синхронизировать с" является однонаправленным и не коммутативным.«А синхронизируется с В» не означает «В синхронизируется с А» (на самом деле, совсем наоборот), в отличие от того, что можно ожидать от английского языка.Таким образом, операция memory_order_acquire RMW не может синхронизироваться ни с чем, но хранилище memory_order_release синхронизируется с операцией memory_order_acquire RMW, которая принимает значение, считанное из хранилища.Аналогично, хотя хранилище memory_order_release не синхронизируется с memory_order_release RMW, memory_order_release RMW может синхронизироваться с нагрузкой memory_order_acquire.
  2. memory_order_acq_rel.
...