Uso XADD o instrucción MOV lugar instrucción ADD! Vea también MFENCE, LFENCE y SFENCE instrucciones!
EDIT: No se puede usar la instrucción LOCK con la instrucción ADD si el operando fuente es un operando de memoria.
De: "Intel® 64 y del Manual de IA-32 ArchitecturesSoftware desarrolladores", donde el operando destino
El prefijo LOCK se antepone única a las siguientes instrucciones y sólo a las formas de las instrucciones es un operando de memoria : AGREGAR, ADC, Y, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NO, O, SBB, SUB, XOR, XADD y XCHG. 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) . También se generará una excepción de código de operación no definida si el prefijo LOCK se usa con cualquier instrucción que no se encuentre en la lista anterior. La instrucción XCHG afirma siempre el # señal BLOQUEO independientemente de la presencia o ausencia del prefijo LOCK
Edit2: Forma: "Intel® 64 y el Manual del IA-32 ArchitecturesSoftware desarrollador, Volume3A"
8.1.1 Operaciones atómicas garantizadas. El procesador Intel486 (y más recientes procesadores desde entonces) garantiza que los siguientes operaciones básicas de la memoria se siempre llevarse a cabo de forma atómica:
- de lectura o escritura de un byte
- leyendo o escribiendo una palabra alineado en una límite
- leer o escribir una palabra doble alineados en un límite de 32 bits
El procesador Pentium (un 16-bit nd nuevas procesadores desde) garantiza que el después de las operaciones de memoria adicionales siempre se llevará a cabo atómicamente:
- leer o escribir una palabra cuádruple alineados en un límite de 64 bits
- 6 bits accede a la memoria no en caché ubicaciones que se ajustan dentro de un bus de datos de 32 bits
los procesadores de la familia P6
(y más nuevos procesadores desde
) garantía de que la siguiente operación
la memoria adicional
siempre llevarse a cabo de forma atómica:
- Unaligned 16, 32 y 64 bits accesos a la memoria caché que encaja
dentro de una línea de caché
accesos a memoria puede almacenar en caché que son división a través de anchos de bus, líneas de caché, y límites de la página no están garantizados ser atómica por el Intel Core 2 Duo, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, familia P6, Pentium y Intel486 procesadores. El procesador Intel Core 2 Duo , Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, y P6 de la familia procesadores proporcionan señales de control de bus que permiten subsistemas de memoria externa para hacer dividida accede atómica; sin embargo, los accesos a datos no alineados serán y afectarán seriamente el rendimiento del procesador , por lo que deben evitarse.
Por lo tanto, para la lectura me prefare utilizar CMPXCHG instrucción con el prefijo LOCK, como:
LOCK CMPXCHG EAX, [J]
Por escritura:
MOV [J], EAX
SFENSE
.
¿Qué es lo que estás tratando de lograr aquí? – Iridium
Todo lo que quiero hacer es leer [J] de una manera segura para hilos. – IamIC