Compartilhar via


Adquirir e liberar semântica

Uma operação adquirirá semântica se outros processadores sempre verão seu efeito antes do efeito de qualquer operação subsequente. Uma operação tem semântica de lançamento se outros processadores verão o efeito de cada operação anterior antes do efeito da operação em si.

Considere o seguinte exemplo de código:

 a++;
 b++;
 c++;

Do ponto de vista de outro processador, as operações anteriores podem parecer ocorrer em qualquer ordem. Por exemplo, o outro processador pode ver o incremento de b antes do incremento de a.

Operações atômicas, como as que as rotinas InterlockedXxx executam, têm semântica de aquisição e liberação por padrão. No entanto, os processadores baseados em Itanium executam operações que só adquirem ou apenas liberam semântica mais rapidamente do que aquelas que têm ambos. Portanto, o sistema fornece versões InterlockedXxxAcquire e InterlockedXxxRelease de algumas das rotinas InterlockedXxx.

Por exemplo, a rotina InterlockedIncrementAcquire usa semântica de aquisição para incrementar uma variável. Se você reescreveu o exemplo de código anterior da seguinte maneira:

 InterlockedIncrementAcquire(&a);
 b++;
 c++;

outros processadores sempre veriam o incremento de a antes dos incrementos de b e c.

Da mesma forma, a rotina InterlockedIncrementRelease usa semântica de versão para incrementar uma variável. Se você reescreveu o exemplo de código mais uma vez, da seguinte maneira:

 a++;
 b++;
 InterlockedIncrementRelease(&c);

outros processadores sempre veriam os incrementos de a e b antes do incremento de c.

Se o processador não fornecer instruções que tenham semântica apenas de aquisição ou apenas de liberação, o sistema usará a rotina correspondente que forneça ambos os tipos de semântica. Por exemplo, em processadores x86, InterlockedIncrementAcquire e InterlockedIncrementRelease são equivalentes a InterlockedIncrement.

A tabela a seguir lista as rotinas que têm variantes somente de aquisição e somente lançamento.

Rotina Xxx interligada Versão Acquire-Semantics-Only Versão Release-Semantics-Only

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease