Префикс LOCK инструкции Intel. В чем смысл?

Я прочитал руководство Intel и обнаружил, что для инструкций есть префикс блокировки, который может предотвратить одновременную запись процессоров в одну и ту же ячейку памяти. Я очень взволнован этим. Думаю, его можно использовать как аппаратный мьютекс. Поэтому я написал кусок кода, чтобы попробовать. Результат весьма расстраивает. Блокировка не поддерживает инструкции MOV или LEA. В руководстве сказано, что LOCK поддерживает только ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD и XCHG. Более того, если префикс LOCK используется с одной из этих инструкций, а исходный операнд является операндом памяти, может быть сгенерировано неопределенное исключение кода операции (#UD ).

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

Например. Я написал код ++ (*p )на C. p — это указатель на разделяемую память. Соответствующая сборка имеет вид:

movl    28(%esp), %eax
movl    (%eax), %eax
leal    1(%eax), %edx
movl    28(%esp), %eax
movl    %edx, (%eax)

Я добавил «lock» перед «movl» и «leal», но процессор жалуется «Invalid Instruction». :-(Полагаю, единственный способ сериализовать операции записи — это использовать программный мьютекс, верно?

5
задан Jeff 26 September 2016 в 22:53
поделиться