Почему fetch_sub не является операцией релиза?
Цитируется из C++ Concurrency in Action $ Листинг 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 ответ
Решение
- "синхронизировать с" является однонаправленным и не коммутативным. "А синхронизируется с В" не означает "В синхронизируется с А" (на самом деле, совсем наоборот), в отличие от того, что можно ожидать от английского языка. Таким образом,
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
нагрузки. memory_order_acq_rel
,