Requisitos de alineación para instrucciones atomic x86.
Microsoft ofrece laInterlockedCompareExchange
Función para realizar operaciones atómicas de comparación y cambio. También hay un_InterlockedCompareExchange
intrínseco.
En x86 estos se implementan utilizando elcmpxchg
instrucción.
Sin embargo, al leer la documentación sobre estos tres enfoques, no parecen estar de acuerdo con los requisitos de alineación.
De Intelmanual de referencia no dice nada sobre la alineación (aparte de esoSi la verificación de alineación está habilitada y se hace una referencia de memoria no alineada, se genera una excepción)
También busqué lalock
prefijo, que establece específicamente que
La integridad del prefijo LOCK esno afectado por la alineación del campo de memoria.
(énfasis mío)
Así que Intel parece decir que la alineación es irrelevante. La operación será atómica pase lo que pase.
los_InterlockedCompareExchange
la documentación intrínseca tampoco dice nada acerca de la alineación, sin embargo, laInterlockedCompareExchange
función Establece que
Los parámetros para esta función deben alinearse en un límite de 32 bits; de lo contrario, la función se comportará de forma impredecible en los sistemas multiprocesador x86 y en cualquier sistema que no sea x86.
Entonces, ¿qué da? ¿Son los requisitos de alineación paraInterlockedCompareExchange
solo para asegurarnos de que la función funcionará incluso en las CPU previas a 486, dondecmpxchg
la instrucción no está disponible? Parece probable que esté basado en la información anterior, pero me gustaría estar seguro antes de confiar en ella. :)
¿O es la alineación requerida por la ISA para garantizar la atomicidad, y simplemente estoy buscando los lugares equivocados en los manuales de referencia de Intel?