Принимая (и перефразируя) ваши три вопроса отдельно:
1. Зачем очищать запись доступа?
Когда применяется строгое вложение кода, например, когда вы работаете с прерываниями, CLREX
обычно не требуется. Однако бывают случаи, когда это важно. Представьте, что вы пишете переключатель контекста для вытесняющего ядра операционной системы, который может асинхронно приостанавливать запущенную задачу и возобновлять другую. Теперь рассмотрим следующую патологическую ситуацию, включающую две задачи одинакового приоритета (A и B), манипулирующие одним и тем же общим ресурсом с использованием LDREX
и STREX
:
Task A Task B
...
LDREX
-------------------- context switch
LDREX
STREX (succeeds)
...
LDREX
-------------------- context switch
STREX (succeeds, and should not)
...
Поэтому, чтобы избежать этого, переключатель контекста должен выдать CLREX
.
2. Какого «требования к фиктивному магазину» избегают?
Если бы не было инструкции CLREX
, то было бы необходимо использовать STREX
, чтобы освободить флаг монопольного доступа, который включает транзакцию памяти и, следовательно, медленнее, чем нужно, если все, что вы хотите сделать, это очистить флаг.
3. Является ли «глобальный рекорд» для многоядерных сценариев?
Да, если вы используете одноядерный компьютер, есть только одна запись, потому что есть только один процессор.