インタロックされた変数アクセス
アプリケーションは、複数のスレッドで共有されている変数へのアクセスを同期する必要があります。 また、アプリケーションでは、これらの変数に対する操作がアトミックに実行されるようにする必要があります (全体で実行されるか、まったく実行されません)。
適切に配置された 32 ビット変数への単純な読み取りと書き込みはアトミック操作です。 つまり、変数の 1 つの部分だけが更新されるわけではありません。すべてのビットはアトミックな方法で更新されます。 ただし、アクセスが同期される保証はありません。 2 つのスレッドが同じ変数から読み取りと書き込みを行っている場合、一方のスレッドが読み取り操作を実行してから、もう一方のスレッドが書き込み操作を実行するかどうかを判断できません。
適切に配置された 64 ビット変数への単純な読み取りと書き込みは、64 ビット Windows ではアトミックです。 64 ビット値への読み取りと書き込みは、32 ビット Windows ではアトミックであるとは限りません。 他のサイズの変数に対する読み取りと書き込みは、どのプラットフォームでもアトミックであるとは限りません。
The Interlocked API
インターロック関数は、複数のスレッドによって共有される変数へのアクセスを同期するための簡単なメカニズムを提供します。 また、変数に対する操作もアトミックな方法で実行します。 変数が共有メモリ内にある場合、さまざまなプロセスのスレッドでこれらの関数を使用できます。
InterlockedIncrement 関数と InterlockedDecrement 関数は、変数をアトミック操作にインクリメントまたはデクリメントする手順を組み合わせます。 この機能は、マルチタスク オペレーティング システムで役立ちます。このオペレーティング システムでは、あるスレッドの実行を中断して、プロセッサ時間のスライスを別のスレッドに付与できます。 このような同期がないと、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 などです。 メモリの取得セマンティクスは、現在のスレッドによって実行されているメモリ操作が、他のメモリ操作が試行される前に表示されることを指定します。 解放メモリ セマンティクスは、現在のスレッドによって実行されているメモリ操作が、他のすべてのメモリ操作が完了した後に表示されるように指定します。 これらのセマンティクスを使用すると、メモリ操作を特定の順序で強制的に実行できます。 保護された領域に入るときは取得セマンティクスを使用し、それを離れるときはセマンティクスを解放します。
関連トピック