Я видел это этот вопрос о приобретении, выпуске, потреблении и т. д. существует, однако, ни один ответ на самом деле не определяет, что на самом деле означает «операция потребления».
В пункте 1 1.10 говорится:
Операция синхронизации в одной или нескольких ячейках памяти является либо операцией потребления, операцией получения, операцией освобождения, либо операцией получения и освобождения.
Я задавался вопросом, может ли кто-нибудь объяснить, что это такое, как оно используется в разделе 1.10 стандарта C ++ 11?
По-видимому, после некоторого поиска «операция потребления» — это операция с памятью, при которой значение, считываемое из памяти, используется после загрузки в нескольких операциях и создает зависимость от данных.
Способность упорядочивать операции без введения явных заборов памяти — вот что является очевидной (из моего понимания) целью memory_order_consume
,
С
memory_order_consume
, компилятор и процессор требуется упорядочить данную нагрузку только для тех последующих загрузок и хранилищ, адрес или значение которых вычисляются из загруженного значения.
источник
Далее в этом тексте говорится:
/*Example code elided */
Ключевым моментом является то, что
atomic_load_explicit()
с помощьюmemory_order_consume
гарантирует, что последующие обращения будут видеть любую инициализацию, выполненнуюinsert_foo()
даже если они выполняются одновременно и без накладных расходов на явные инструкции по ограничению памяти. В противоположность,memory_order_acquire
потребовал бы явных барьеров памяти в слабо упорядоченных системах и чрезмерно ограничил бы оптимизацию компилятора во всех системах.
Проект стандарта C ++ 11 n3485 определяет memory_order_consume
как:
29.3 Порядок и последовательность [atomics.order]
memory_order_consume: операция загрузки выполняет операцию потребления в уязвимом месте памяти.
Так что, насколько я понимаю, это порядок загрузки памяти, чтобы последующие загрузки и сохранения, использующие эту загрузку, действительно последующий. Другими словами, нагрузка в настоящее время потребляются.
Других решений пока нет …