Abrufen und Freigeben von Semantik

Ein Vorgang hat eine Semantik, wenn andere Prozessoren ihre Wirkung immer vor dem Effekt eines nachfolgenden Vorgangs sehen. Ein Vorgang verfügt über eine Freigabesemantik , wenn andere Prozessoren die Auswirkungen jedes vorherigen Vorgangs vor der Auswirkung des Vorgangs selbst sehen.

Betrachten Sie das folgende Codebeispiel:

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

Aus Sicht eines anderen Prozessors können die vorherigen Vorgänge in beliebiger Reihenfolge auftreten. Beispielsweise kann dem anderen Prozessor das Inkrement von b vor dem Inkrement von angezeigt werden a.

Atomische Vorgänge, z. B. die, die die interlockedXxx-Routinen ausführen, verfügen standardmäßig über Abruf- und Freigabesemantik. Itanium-basierte Prozessoren führen jedoch Vorgänge aus, die nur schneller Semantik abrufen oder freigeben als solche, die beides aufweisen. Daher stellt das System interlockedXxxAcquire - und InterlockedXxxRelease-Versionen einiger der interlockedXxx-Routinen bereit.

Beispielsweise verwendet die InterlockedIncrementAcquire-Routine Acquire-Semantik, um eine Variable zu erhöhen. Wenn Sie das vorangehende Codebeispiel wie folgt umgeschrieben haben:

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

Andere Prozessoren sehen immer das Inkrement von a vor den Inkrementen von b und c.

Ebenso verwendet die InterlockedIncrementRelease-Routine Releasesemantik, um eine Variable zu inkrementieren. Wenn Sie das Codebeispiel wie folgt erneut schreiben:

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

Andere Prozessoren sehen immer die Inkremente von a und b vor dem Inkrement von c.

Wenn der Prozessor keine Anweisungen bereitstellt, die nur Über- oder Freigabesemantik verfügen, verwendet das System die entsprechende Routine, die beide Semantiktypen bereitstellt. Beispielsweise sind auf x86-Prozessoren sowohl InterlockedIncrementAcquire als auch InterlockedIncrementRelease mit InterlockedIncrement identisch.

In der folgenden Tabelle sind die Routinen aufgeführt, die nur acquire- und release-only-Varianten aufweisen.

InterlockedXxx Routine Reine Acquire-Semantics-Version Nur Releasesemantikversion

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease