uso InterlockedIncrement
-
03-07-2019 - |
Pergunta
Ao ler sobre a função InterlockedIncrement Eu vi a observação de que a variável passada deve ser alinhado em um limite de 32 bits. Normalmente eu vi o código que utiliza a InterlockedIncrement assim:
class A
{
public:
A();
void f();
private:
volatile long m_count;
};
A::A() : m_count(0)
{
}
void A::f()
{
::InterlockedIncrement(&m_count);
}
Será que o trabalho de código acima corretamente em sistemas multi-processador ou devo levar mais alguns cuidados para isso?
Solução
Tudo depende das suas configurações do compilador. No entanto, por padrão, qualquer coisa oito bytes e sob será alinhado em um limite natural. Assim, um "int" que ser alinhado em um limite de 32 bits.
Além disso, a directiva "pragma pacote" pode ser usado para o alinhamento mudança dentro de uma unidade de compilação.
Gostaria de acrescentar que a resposta assume compilador Microsoft C / C ++. regras de embalagem pode ser diferente do compilador para compilador. Mas, em geral, gostaria de assumem que a maioria dos C / C ++ compiladores para Windows usam os mesmos padrões de embalagem apenas para tornar o trabalho com cabeçalhos Microsoft SDK um pouco mais fácil.
Outras dicas
A aparência de código fina (variáveis ??serão devidamente alinhados, a menos que especificamente fazer algo para quebrar isso - geralmente envolvendo vazamento ou 'embalado' estruturas).
Sim, isso vai funcionar bem. Compiladores costumam fazer alinhar salvo ordem em contrário.
A rigor, ele realmente depende do seu uso de A - por exemplo, se você arrumar um objeto "A" dentro de um ITEMIDLIST shell, ou um struct com um mau "pragma pacote" os dados não podem ser devidamente alinhados <. / p>