2010-07-27 12 views
6

que saben cómo utilizar el bloqueo de seguridad para enhebrar-incrementar un valor de:¿Cómo uso el prefijo LOCK ASM para leer un valor?

lock inc  [J]; 

Pero ¿cómo puedo leer [J] (o cualquier valor) de una manera segura para los subprocesos? El prefijo LOCK no se puede usar con mov. Y si hago lo siguiente:

xor eax, eax; 
    lock add eax, [J]; 
    mov [JC], eax; 

Se genera un error en la línea 2.

+0

¿Qué es lo que estás tratando de lograr aquí? – Iridium

+0

Todo lo que quiero hacer es leer [J] de una manera segura para hilos. – IamIC

Respuesta

9

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 

.

+0

El compilador se niega a compilar la línea 2. Incluso al cambiarlo a: xadd eax, dword ptr J; no funciona. – IamIC

+0

¡Sí, la razón es que el operando fuente es un operando de memoria! –

+0

Gracias por la aclaración sobre por qué no compilaría. Parece que tendría que usar las instrucciones de cercado, o simplemente hacer una instantánea del valor que, como está siendo procesado de solo lectura, no debería ser un problema en cuanto a la seguridad del hilo: mov eax, [ J]; mov [JSnapshot], eax; – IamIC

Cuestiones relacionadas