Acesso à variável intertravada

Os aplicativos devem sincronizar o acesso a variáveis que são 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.)

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 para 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 as leituras e gravações em variáveis de outros tamanhos sejam atômicas em nenhuma plataforma.

A API interligada

As funções interligadas fornecem um mecanismo simples para sincronizar o acesso a uma variável que é 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 diminuiçã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 a outro thread. Sem essa sincronização, dois threads podiam 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 a variáveis interligadas 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, InterlockedCompare64Exchange128 e 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, InterlockedOr e InterlockedXor executam atomicamente operações AND, OR e XOR, respectivamente.

Há funções projetadas especificamente para executar acesso a variáveis interligadas 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. Também há funções que combinam as operações básicas de acesso a variáveis interligadas 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. A semântica de memória de aquisição especifica que a operação de memória que está sendo executada pelo thread atual ficará visível antes que outras operações de memória sejam tentadas. A semântica de memória de liberação especifica que a operação de memória que está sendo executada pelo thread atual ficará visível depois que todas as outras operações de memória forem concluídas. Essas semânticas permitem forçar 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.

Intrínsecos do compilador

Sincronização e problemas de multiprocessador