Префикс кода операции блокировки бесполезен из-за механизма согласованности кеша?

В руководстве Intel говорится:

8.1.4 Влияние операции LOCK на внутренние кэши процессора
...
Механизм согласованности кэша автоматически предотвращает одновременное изменение данных в этой области двумя или более процессорами, которые кэшировали одну и ту же область памяти.

Означает ли это, что префикс кода операции lock бесполезен для программирования приложений?

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

«Механизм согласованности кэша» является неотъемлемой частью кеш-памяти многоядерных процессоров, он работает всегда независимо от того, используете ли вы префикс lock или нет.

Более подробный вопрос:
У меня процессор Core2Duo, и моя прикладная программа работает в двух параллельных потоках, работающих с общими глобальными переменными.
Безопасно ли мне пропускать префикс lock в таких инструкциях, как lock add [ESI],EAX и lock cmpxchg8b [ESI]?


person Egor Skriptunoff    schedule 25.03.2016    source источник
comment
Нет, опускать его небезопасно. Согласованность кэша не делает инструкции атомарными.   -  person Jester    schedule 26.03.2016
comment
Механизм согласованности только предотвращает возможность, например, L1 ядра A иметь кэшированную копию строки кэша с данными, отличными от данных L1 ядра B. Чтобы добавить к ответу Росса, обратите внимание, что add [esi], eax на самом деле является загрузкой, добавлением и магазином.   -  person Peter Cordes    schedule 26.03.2016


Ответы (1)


Нет, без префикса LOCK блокировка кеша не будет удерживаться на протяжении всей операции чтения / изменения / записи. Это означает, что операция не будет казаться атомарной для других процессоров. Префикс LOCK также обеспечивает строгий порядок памяти вместо обычно используемого несколько более слабого строгого порядка памяти.

person Ross Ridge    schedule 25.03.2016