Dela via


Hämta och frisläppa semantik

En åtgärd har hämta semantik om andra processorer alltid ser dess effekt före någon efterföljande åtgärds effekt. En åtgärd har release-semantik om andra processorer ser effekten av varje föregående åtgärd före effekten av åtgärden själv.

Tänk dig följande kodexempel:

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

Från en annan processors synvinkel kan de föregående åtgärderna verka ske i valfri ordning. Den andra processorn kan till exempel se inkrementet b innan a.

Atomiska operationer, såsom de som InterlockedXxx rutiner utför, har både hämtnings- och frigivningssemantik som standard. Itanium-baserade processorer kör dock operationer med endast hämta- eller släppsemantik snabbare än de som har båda. Därför tillhandahåller systemet InterlockedXxxAcquire and InterlockedXxxRelease versioner av några av InterlockedXxx rutiner.

Till exempel InterlockedIncrementAcquire rutin använder hämta semantik för att öka en variabel. Om du skriver om föregående kodexempel på följande sätt:

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

andra processorer skulle alltid se ökningen av a före stegen för b och c.

På samma sätt använder InterlockedIncrementRelease rutin versionssemantik för att öka en variabel. Om du skriver om kodexemplet igen, enligt följande:

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

andra processorer skulle alltid se ökningarna av a och b före ökningen av c.

Om processorn inte tillhandahåller instruktioner som bara har hämtat eller endast släpper semantik använder systemet motsvarande rutin som tillhandahåller båda typerna av semantik. På x86-processorer är till exempel både InterlockedIncrementAcquire och InterlockedIncrementRelease likvärdiga med InterlockedIncrement.

I följande tabell visas de rutiner som har endast hämtnings- och släppvarianter.

Sammankoppladexxx rutin HämtaSemantics-Only-versionen Release –Semantics-Only version

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease