multithreading - thread - En un x86 multinúcleo, ¿es necesario un BLOQUEO como prefijo de XCHG?
thread python 3 (3)
Si mem
es una ubicación de memoria compartida, necesito:
XCHG EAX,mem
o:
LOCK XCHG EAX,mem
¿Hacer el intercambio atómicamente?
Googlear esto produce respuestas tanto sí como no. ¿Alguien sabe esto definitivamente?
De acuerdo con el manual de instrucciones 80386 , el BUS LOCK
se confirma durante la duración del intercambio. El prefijo LOCK
no tiene prioridad para esta operación y tampoco lo tiene el valor del Nivel de privilegio de E / S.
Mi sugerencia es que, dado que la documentación indica que BUS LOCK
se valida independientemente de la presencia del prefijo LOCK XCHG EAX, mem
, LOCK XCHG EAX, mem
es seguro. En caso de duda, agregue un LOCK
.
Desde 386 días, xchg afirmará la señal de Bloqueo, ya sea que coloques el prefijo de bloqueo o no. La documentación de Intel cubre esto claramente en la referencia de conjunto de instrucciones IA-32 NZ.
La documentación de Intel parece bastante clara de que es redundante.
IA-32 Manual del desarrollador de software de arquitectura Intel® Volumen 3A: Guía de programación del sistema, Parte 1
7.1.2.1 dice:
Las operaciones en las que el procesador sigue automáticamente la semántica LOCK son las siguientes:
- Al ejecutar una instrucción XCHG que hace referencia a la memoria.
Similar,
Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32 Volumen 2B: Referencia del conjunto de instrucciones, NZ
XCHG:
Si se hace referencia a un operando de memoria, el protocolo de bloqueo del procesador se implementa automáticamente durante la operación de intercambio, independientemente de la presencia o ausencia del prefijo LOCK o del valor del IOPL.
Tenga en cuenta que esto no significa en realidad que la señal de BLOQUEO se afirme ya sea que se use el prefijo de BLOQUEO o no, 7.1.4 describe cómo se conservan los semánticos de bloqueo de los procesadores posteriores sin un BLOQUEO de LOCK si se almacena en caché la ubicación de la memoria. Inteligente, y definitivamente sobre mi cabeza.