Leí el manual de Intel y encontré que hay un prefijo de bloqueo para las instrucciones, lo que puede evitar que los procesadores escriban en la misma ubicación de memoria al mismo tiempo. Estoy bastante emocionado al respecto. Supongo que podría usarse como hardware mutex. Así que escribí un fragmento de código para tener una oportunidad. El resultado es bastante frustrante. El bloqueo no es compatible con las instrucciones MOV o LEA. El manual dice que LOCK solo es compatible con ADD, ADC, Y, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NO, O, SBB, SUB, XOR, XADD y XCHG. Además, si el prefijo LOCK se usa con una de estas instrucciones y el operando de origen es un operando de memoria, se puede generar una excepción de código de operación indefinida (#UD).Prefijo LOCK de la instrucción Intel. ¿Cual es el punto?
Me pregunto por qué tantas limitaciones, tantas restricciones hacen que LOCK parezca inútil. No puedo usarlo para garantizar que una operación general de escritura no tenga datos sucios u otros problemas causados por el paralelismo.
E.g. Escribí el código ++ (* p) en C. p es un puntero a una memoria compartida. El montaje correspondiente es como:
movl 28(%esp), %eax
movl (%eax), %eax
leal 1(%eax), %edx
movl 28(%esp), %eax
movl %edx, (%eax)
añadí "LOCK" antes de "movl" y "leal", pero el procesador se queja "instrucción no válida". :-(Creo que la única manera de hacer que las operaciones de escritura serializados es el uso de software de exclusión mutua, ¿verdad?
http://en.wikipedia.org/wiki/Fetch-and-add – Mysticial
http://en.wikipedia.org/wiki/Compare-and-swap – Mysticial
Un 'movl' en una dirección alineada es siempre atómico , entonces el bloqueo no haría ninguna diferencia. – hirschhornsalz