Partilhar via


Semântica de aquisição e liberação

Uma operação adquiriu 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 liberação 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 a antes do incremento de b.

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

Por exemplo, a rotina InterlockedIncrementAcquire usa a 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 liberaçã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 apenas adquirido ou liberado semântica, o sistema usará a rotina correspondente que fornece 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 de lançamento.

RotinaXxx Interlocked Adquirir - VersãoSemantics-Only VersãoSemantics-Only

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAdquirir

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease