Почему 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 ответ

Решение
  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,
Другие вопросы по тегам