Anotações de driver para operandos interligados
Uma grande família de funções usa como um de seus parâmetros o endereço de uma variável que deve ser acessada usando uma instrução de processador interligada. Essas são instruções atômicas de leitura em cache e, se os operandos forem usados incorretamente, ocorrerão bugs muito sutis.
Use a anotação a seguir para parâmetros de função para identificá-la como um operando interligado.
Anotação de operando interlocked | Descrição |
---|---|
_Interlocked_operand_ | O parâmetro de função anotada é o operando de destino de uma das funções interligadas. Esses operandos devem ter propriedades adicionais específicas. |
Os parâmetros de função anotados com o _Interlocked_operand_ devem ser compartilhados entre processos. As variáveis usadas com essa anotação devem:
Ser declarado volátil.
Não seja uma variável local. O uso de uma variável local geralmente indica um mal-entendido da intenção da função. Mesmo que uma variável local seja compartilhada de alguma forma, os requisitos de paginação do sistema tornam o endereçamento de variáveis em outro processo problemático.
Não será acessado, exceto por uma função interligada. Sem o uso explícito de uma função interligada, a operação pode acessar dados obsoletos, pode ocorrer apenas no cache de um único processador ou pode ser atrasada para atingir o restante do sistema.
As funções fornecidas pelo sistema já estão anotadas para operandos interligados.
O exemplo a seguir mostra a anotação para a função InterlockedExchange . Essa anotação especifica que o parâmetro Target sempre deve ser acessado usando uma operação interligada.
LONG
InterlockedExchange (
_Inout_ _Interlocked_operand_ LONG volatile *Target,
_In_ LONG Value
);