Что такое операция потребления в стандарте С++ 11?

Я видел, что этот вопрос о приобретении, выпуске, потреблении и т.д. существует, однако ни один ответ действительно не определяет, что на самом деле означает "операция потребления".

В пункте 1.10 пункта 5 говорится:

Операция синхронизации в одном или нескольких ячейках памяти представляет собой либо операцию потребления, операцию получения, операцию освобождения, либо операцию получения и освобождения.

Я задавался вопросом, может ли кто-нибудь объяснить, что это такое, как он используется в разделе 1.10 стандарта С++ 11?

Ответ 1

По-видимому, после некоторого поиска вокруг "операция потребления" является операцией памяти, в которой значение, считанное из памяти, используется после загрузки в нескольких операциях и создает зависимость данных.

Возможность упорядочивать операции без введения явных заграждений памяти заключается в том, что кажущаяся (с моей точки зрения) цель - memory_order_consume.

С memory_order_consume компилятор и ЦП обязаны заказывать рассматриваемую нагрузку только на следующие последующие загрузки и хранилища, адрес или значение которых вычисляются из загруженного значения. источник

Позже в этом тексте говорится:

/*Example code elided */

Ключевым моментом является то, что atomic_load_explicit() с использованием memory_order_consume гарантирует, что последующие обращения будут видеть инициализацию, выполняемую insert_foo(), даже если они выполняются одновременно, и без накладных инструкций явной памяти. В constrast memory_order_acquire потребует явных барьеров памяти для слабо упорядоченных систем и будет чрезмерно сузить оптимизацию компилятора во всех системах.

С++ 11 Стандартный черновик n3485 определяет memory_order_consume как:

29.3 Порядок и согласованность [atomics.order]

memory_order_consume: операция загрузки выполняет операцию потребления в поврежденной ячейке памяти.

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