Microsoft ofrece la función InterlockedCompareExchange
para realizar operaciones atómicas de comparación e intercambio. También hay un _InterlockedCompareExchange
intrínseco.requisitos de alineación para atomic x86 instructions
En x86 estos se implementan utilizando la instrucción cmpxchg
.
Sin embargo, al leer la documentación sobre estos tres enfoques, no parecen estar de acuerdo con los requisitos de alineación.
de Intel reference manual dice nada acerca de la alineación (excepto los de comprobación si alineación está habilitado y una referencia de memoria no alineado se hace, se genera una excepción)
También busqué el prefijo lock
, que establece específicamente que
la integridad del prefijo LOCK es no afectados por la alineación del campo de memoria.
(el énfasis es mío)
Así Intel parece decir que la alineación es irrelevante. La operación será atómica sin importar qué.
La documentación intrínseca _InterlockedCompareExchange
tampoco dice nada sobre la alineación, sin embargo la función InterlockedCompareExchange
establece que
Los parámetros para esta función deben estar alineados en un límite de 32 bits; de lo contrario, la función se comportará de forma impredecible en sistemas multiprocesador x86 y cualquier sistema que no sea x86.
¿Qué ofrece? ¿Los requisitos de alineación para InterlockedCompareExchange
solo son para asegurarse de que la función funcionará incluso en CPUs pre-486 donde la instrucción cmpxchg
no está disponible? Eso parece estar basado en la información anterior, pero me gustaría estar seguro antes de confiar en él. :)
¿O es la alineación requerida por el ISA para garantizar la atomicidad, y solo estoy buscando los lugares incorrectos en los manuales de referencia de Intel?
El texto que menciono arriba ES de los manuales de Intel y establece claramente los diferentes requisitos de alineación por familia de procesadores. Probablemente debería haber usado una redacción diferente para expresar que la información ACTUALIZADA de Intel es muy clara, supongo que lo que obtienes por leer un .pdf de 1999. – damageboy
-1: Has sacado la sección incorrecta del manual correcto. Las operaciones básicas de memoria y las operaciones atómicas bloqueadas son cosas diferentes. –
@damageboy -1: Como correctamente señala MackieMesser, su cita habla de * operaciones de memoria * básicas y no * operaciones atómicas *, es decir, operaciones con un 'BLOQUEO ', que era lo que OP preguntó, como' BLOQUEO 'es lo que utilizado en caso de operaciones atómicas x86. –