Uso de enclavamiento
-
03-07-2019 - |
Pregunta
Mientras lee sobre la función InterlockedIncrement Vi el comentario de que la variable pasada debe alinearse en un límite de 32 bits. Normalmente he visto el código que utiliza el Encierro de bloqueo como este:
class A
{
public:
A();
void f();
private:
volatile long m_count;
};
A::A() : m_count(0)
{
}
void A::f()
{
::InterlockedIncrement(&m_count);
}
¿El código anterior funciona correctamente en los sistemas con multiprocesadores o debería tener más cuidado con esto?
Solución
Depende de la configuración de tu compilador. Sin embargo, de forma predeterminada, cualquier cosa de ocho bytes o menos se alineará en un límite natural. Por lo tanto, un " int " Estaremos alineados en un límite de 32 bits.
También, el " #pragma pack " La directiva se puede utilizar para cambiar la alineación dentro de una unidad de compilación.
Me gustaría agregar que la respuesta asume el compilador Microsoft C / C ++. Las reglas de embalaje pueden diferir de compilador a compilador. Pero en general, asumiría que la mayoría de los compiladores de C / C ++ para Windows usan los mismos valores predeterminados de empaquetado solo para facilitar el trabajo con los encabezados de Microsoft SDK.
Otros consejos
El código se ve bien (las variables se alinearán correctamente a menos que hagas algo específicamente para romper eso, que generalmente involucra estructuras de "empaquetado" o "empaquetado").
Sí, esto funcionará bien. Los compiladores generalmente se alinean a menos que se indique lo contrario.
Estrictamente hablando, realmente depende de su uso de A, por ejemplo, si empaqueta un " A " objeto dentro de una shell ITEMIDLIST, o una estructura con un mal paquete de pragma " " los datos pueden no estar correctamente alineados.