Acesso a variável intertravada
Os aplicativos devem sincronizar o acesso a variáveis compartilhadas por vários threads. Os aplicativos também devem garantir que as operações nessas variáveis sejam executadas atomicamente (executadas em sua totalidade ou não em tudo).)
Leituras e gravações simples em variáveis de 32 bits alinhadas corretamente são operações atômicas. Em outras palavras, você não acabará com apenas uma parte da variável atualizada; todos os bits são atualizados de forma atômica. No entanto, não há garantia de que o acesso seja sincronizado. Se dois threads estiverem lendo e gravando da mesma variável, você não poderá determinar se um thread executará sua operação de leitura antes que o outro execute sua operação de gravação.
Leituras e gravações simples em variáveis de 64 bits alinhadas corretamente são atômicas no Windows de 64 bits. Não há garantia de que as leituras e gravações em valores de 64 bits sejam atômicas no Windows de 32 bits. Não há garantia de que leituras e gravações em variáveis de outros tamanhos sejam atômicas em nenhuma plataforma.
A API intertravada
As funções intertravadas fornecem um mecanismo simples para sincronizar o acesso a uma variável compartilhada por vários threads. Eles também executam operações em variáveis de maneira atômica. Os threads de processos diferentes podem usar essas funções se a variável estiver na memória compartilhada.
As funções InterlockedIncrement e InterlockedDecrement combinam as etapas envolvidas no incremento ou decrementação de uma variável em uma operação atômica. Esse recurso é útil em um sistema operacional multitarefa, no qual o sistema pode interromper a execução de um thread para conceder uma fatia de tempo do processador para outro thread. Sem essa sincronização, dois threads poderiam ler o mesmo valor, incrementá-lo em 1 e armazenar o novo valor para um aumento total de 1 em vez de 2. As funções de acesso variável intertravadas protegem contra esse tipo de erro.
As funções InterlockedExchange e InterlockedExchangePointer trocam atomicamente os valores das variáveis especificadas. A função InterlockedExchangeAdd combina duas operações: adicionar duas variáveis e armazenar o resultado em uma das variáveis.
As funções InterlockedCompareExchange, InterlockedCompare64Exchange128e InterlockedCompareExchangePointer combinam duas operações: comparar dois valores e armazenar um terceiro valor em uma das variáveis, com base no resultado da comparação.
As funções InterlockedAnd, InterlockedOre funções de InterlockedXor executam operações AND, OR e XOR atomicamente, respectivamente.
Há funções projetadas especificamente para executar acesso a variáveis intertravadas em endereços e valores de memória de 64 bits e otimizadas para uso no Windows de 64 bits. Cada uma dessas funções contém "64" no nome; por exemplo, InterlockedDecrement64 e InterlockedCompareExchangeAcquire64.
A maioria das funções interligadas fornece barreiras de memória completa em todas as plataformas Windows. Há também funções que combinam as operações básicas de acesso a variáveis intertravadas com a semântica de ordenação de memória de aquisição e liberação com suporte por determinados processadores. Cada uma dessas funções contém a palavra "Adquirir" ou "Liberar" em seus nomes; por exemplo, InterlockedDecrementAcquire e InterlockedDecrementRelease. Adquirir semântica de memória especifica que a operação de memória executada pelo thread atual ficará visível antes de qualquer outra operação de memória ser tentada. A semântica de memória de versão especifica que a operação de memória executada pelo thread atual ficará visível depois que todas as outras operações de memória forem concluídas. Essas semânticas permitem que você force as operações de memória a serem executadas em uma ordem específica. Use a semântica de aquisição ao inserir uma região protegida e liberar semântica ao deixá-la.
Tópicos relacionados