他のプロセッサが後続の操作の効果の前に必ずその効果を実感する場合、操作は セマンティクスを取得 したことになります。 操作自体の効果の前に、他のプロセッサに先行するすべての操作の効果が表示される場合、操作には リリースセマンティクス を取得したことになります。
次のコード例について考えてみます。
a++;
b++;
c++;
別のプロセッサの観点からは、上記の操作はあらゆる順序で発生しているように見える場合があります。 例えば他のプロセッサでは、 aインクリメントの前に b のインクリメントが表示される場合があります。
InterlockedXxx ルーチンが実行するようなアトミック操作には、デフォルトで取得セマンティクスとリリース セマンティクスの両方があります。 ただし、Itaniumベースのプロセッサは両方を持つプロセッサよりも速く、取得またはリリースセマンティクスのみを持つ操作を実行します。 したがって、システムは InterlockedXxx ルーチンの一部の InterlockedXxx取得 と InterlockedXxxリリース バージョンを提供します。
例えば、 InterlockedIncrementAcquire ルーチンは、変数をインクリメントするために取得セマンティクスを使用します。 前のコード例を次のように書き直した場合:
InterlockedIncrementAcquire(&a);
b++;
c++;
他のプロセッサでは、常に b と c インクリメント前の a インクリメントが表示されます 。
同様に、 InterlockedIncrementRelease ルーチンでは、リリース セマンティクスを使用して変数をインクリメントします。 コード例をもう一度書き直した場合は、次のようになります。
a++;
b++;
InterlockedIncrementRelease(&c);
他のプロセッサでは常に、 b と c インクリメント前の a インクリメントが表示されます 。
プロセッサが取得セマンティクスまたはリリースセマンティクスのみを持つ命令を提供しない場合、システムは両方の種類のセマンティクスを提供する対応するルーチンを使用します。 例えば、x86 プロセッサでは、 InterlockedIncrementAcquire と InterlockedIncrementRelease の両方は InterlockedIncrementと同等です。
次の表に、取得専用変数とリリース専用変数を持つルーチンを示します。
| InterlockedXxx ルーチン | 取得セマンティクス専用バージョン | リリース専用セマンティクスバージョン |
|---|---|---|