Sdílet prostřednictvím


Získání a vydání sémantiky

Operace získala sémantiku , pokud ostatní procesory vždy uvidí jeho účinek před jakýmkoli následným účinkem operace. Operace má sémantiku uvolnění , pokud ostatní procesory uvidí před efektem samotné operace všechny předchozí operace.

Vezměme si následující příklad kódu:

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

Z pohledu jiného procesoru se může zobrazit předchozí operace v libovolném pořadí. Například druhý procesor může vidět přírůstek b před přírůstkem a.

Atomické operace, jako ty, které provádějí rutiny InterlockedXxx, mají ve výchozím nastavení sémantiku získání i uvolnění. Procesory založené na architektuře Itanium však provádějí operace, které mají pouze získávací nebo uvolňovací sémantiku, rychleji než ty, které mají obojí. Systém proto poskytuje verze InterlockedXxxAcquire a InterlockedXxxRelease některých rutin InterlockedXxx.

Například rutina InterlockedIncrementAcquire používá sémantiku při získání ke zvýšení proměnné. Pokud přepíšete předchozí příklad kódu následujícím způsobem:

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

ostatní procesory by vždy viděly přírůstek a před přírůstky b a c.

Podobně rutina InterlockedIncrementRelease používá sémantiku vydané verze k zvýšení proměnné. Pokud znovu přepíšete příklad kódu, postupujte takto:

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

ostatní procesory by vždy viděly přírůstky a a b před přírůstkem c.

Pokud procesor neposkytuje instrukce, které mají pouze sémantiku načtení nebo pouze sémantiku uvolnění, systém použije odpovídající rutinu, která poskytuje oba typy sémantiky. Například na procesorech x86 jsou interlockedIncrementAcquire i InterlockedIncrementRelease ekvivalentní interlockedIncrementu.

Následující tabulka uvádí rutiny, které mají varianty pouze pro získání a vydání.

ZamknutáXxx Procedura Získání: VerzeSemantics-Only Verze –Semantics-Only verze

interlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease