Freigeben über


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