Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse 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 |
|---|---|---|