Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 |
|---|---|---|