インタロックされた変数アクセス
アプリケーションは、複数のスレッドによって共有される変数へのアクセスを同期する必要があります。 また、アプリケーションでは、これらの変数に対する操作がアトミックに実行されるようにする必要があります (完全に実行されるか、まったく実行されません)。
適切にアラインされた 32 ビット変数への単純な読み取りと書き込みはアトミック操作です。 つまり、変数の 1 つの部分だけが更新されるわけではありません。すべてのビットはアトミックな方法で更新されます。 ただし、アクセスが同期されるとは限りません。 2 つのスレッドが同じ変数から読み取りと書き込みを行っている場合、一方のスレッドが読み取り操作を実行してから、もう一方のスレッドが書き込み操作を実行するかどうかを判断することはできません。
適切に配置された 64 ビット変数への単純な読み取りと書き込みは、64 ビット Windows ではアトミックです。 64 ビット値への読み取りと書き込みは、32 ビット Windows ではアトミックであるとは限りません。 他のサイズの変数に対する読み取りと書き込みは、どのプラットフォームでもアトミックであるとは限りません。
The Interlocked API
インターロックされた関数は、複数のスレッドによって共有される変数へのアクセスを同期するための簡単なメカニズムを提供します。 また、変数に対してアトミックな方法で操作を実行します。 変数が共有メモリ内にある場合、さまざまなプロセスのスレッドでこれらの関数を使用できます。
InterlockedIncrement 関数と InterlockedDecrement 関数は、変数をアトミック操作にインクリメントまたはデクリメントする手順を組み合わせます。 この機能は、システムが 1 つのスレッドの実行を中断してプロセッサ時間のスライスを別のスレッドに付与できるマルチタスク オペレーティング システムで役立ちます。 このような同期がないと、2 つのスレッドが同じ値を読み取り、1 ずつインクリメントし、2 ではなく合計 1 の新しい値を格納できます。 インターロックされた変数アクセス関数は、この種のエラーから保護します。
InterlockedExchange と InterlockedExchangePointer関数は、指定された変数の値をアトミックに交換します。 InterlockedExchangeAdd 関数は、2 つの変数を一緒に追加し、結果をいずれかの変数に格納する 2 つの操作を組み合わせています。
InterlockedCompareExchange、InterlockedCompare64Exchange128、および InterlockedCompareExchangePointer 関数は、比較の結果に基づいて、2 つの値を比較し、いずれかの変数に 3 番目の値を格納する 2 つの操作を組み合わせます。
InterlockedAnd、InterlockedOr、および InterlockedXor 関数はそれぞれ、AND、OR、XOR の各操作をアトミックに実行します。
64 ビットのメモリ値とアドレスに対して連動変数アクセスを実行するように特別に設計され、64 ビット Windows で使用できるように最適化された関数があります。 これらの各関数には、名前に "64" が含まれています。たとえば、InterlockedDecrement64と InterlockedCompareExchangeAcquire64をします。
インターロックされた関数のほとんどは、すべての Windows プラットフォームで完全なメモリ バリアを提供します。 また、基本のインターロック変数アクセス操作と、特定のプロセッサでサポートされている取得および解放メモリ順序セマンティクスを組み合わせた関数もあります。 これらの各関数には、名前に "Acquire" または "Release" という単語が含まれています。たとえば、InterlockedDecrementAcquireと InterlockedDecrementReleaseをします。 メモリの取得セマンティクスは、現在のスレッドによって実行されているメモリ操作が、他のメモリ操作が試行される前に表示されることを指定します。 解放メモリ セマンティクスでは、他のすべてのメモリ操作が完了した後に、現在のスレッドによって実行されているメモリ操作が表示されるように指定します。 これらのセマンティクスを使用すると、メモリ操作を特定の順序で強制的に実行できます。 保護されたリージョンに入るときに取得セマンティクスを使用し、離れるときにセマンティクスを解放します。
関連トピック