В x86 инструкции с префиксом lock
, такие как lock cmpxchg
, обеспечивают семантику барьера в дополнение к своей атомарной операции: для нормального доступа к памяти в областях памяти с обратной записью операции чтения и записи не переупорядочиваются в инструкциях с префиксом lock
, согласно разделу 8.2.2. Тома 3 Intel SDM:
Операции чтения или записи не могут быть переупорядочены с помощью инструкций ввода-вывода, заблокированных инструкций или инструкций сериализации.
Этот раздел относится только к типам памяти с обратной записью. В том же списке вы найдете исключение, в котором отмечается, что магазины со слабой упорядоченностью не упорядочиваются:
- Чтения не переупорядочиваются с другими чтениями.
- Записи не переупорядочиваются со старыми чтениями.
- Записи в память не переупорядочиваются с другими записями, за следующими исключениями: -
# P4 # # P5 #
Обратите внимание, что нет никаких исключений для вневременных инструкций в любых других элементах списка, например, в элементе, относящемся к инструкциям с префиксом блокировки.
В различных других разделах руководства упоминается, что инструкции mfence
и / или sfence
могут использоваться для упорядочивания памяти, когда используются слабо упорядоченные (невременные) инструкции. В этих разделах обычно не упоминается инструкция с префиксом lock
в качестве альтернативы.
Все это оставляет меня неуверенным: обеспечивают ли инструкции с префиксом lock
тот же полный барьер, который обеспечивает mfence
между слабо упорядоченными (невременными) инструкциями в памяти WB? Тот же вопрос применим снова, но к любому типу доступа к памяти WC.