Partilhar via


Acesso variável interbloqueado

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 realizadas).

Leituras e gravações simples em variáveis de 32 bits devidamente alinhadas 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 é garantido que o acesso seja sincronizado. Se dois threads estiverem lendo e gravando a partir 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 devidamente alinhadas são atômicas no Windows de 64 bits. Não é garantido que as leituras e gravações em valores de 64 bits sejam atômicas no Windows de 32 bits. Não é garantido que 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 realizam operações em variáveis de forma atômica. Os threads de diferentes processos 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 do 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 interligadas protegem contra este 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 juntas 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 InterlockedXor executam atomicamente operações E, OR e XOR, respectivamente.

Há funções que são especificamente projetadas para executar acesso variável intertravado em valores e endereços de memória de 64 bits e são 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 fornecem barreiras de memória total em todas as plataformas Windows. Há também funções que combinam as operações básicas de acesso variável intertravado com a semântica de ordenação de memória de aquisição e liberação suportada 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 que está sendo executada pelo thread atual será visível antes de qualquer outra operação de memória ser tentada. A semântica da 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 que você force operações de memória a serem executadas em uma ordem específica. Use adquirir semântica ao entrar em uma região protegida e liberar semântica ao sair.

Compilador Intrínsecos

Problemas de sincronização e multiprocessador