同期バリア
同期バリアを使用すると、スレッドが続行する前に、すべてのスレッドが特定の実行ポイントに達するまで、複数のスレッドを待機できます。 同期バリアをプロセス間で共有することはできません。
同期バリアは、同じコードを並列で実行するスレッドが、次のフェーズに進む前に 1 つのフェーズをすべて完了する必要があるフェーズ計算に役立ちます。
同期バリアを作成するには、 InitializeSynchronizationBarrier 関数を呼び出し、スレッドの最大数と、スレッドがブロックされるまでに回転する回数を指定します。 次に、バリアを使用するスレッドを起動します。 各スレッドが作業を完了すると、 EnterSynchronizationBarrier を呼び出してバリアで待機します。 EnterSynchronizationBarrier 関数は、バリアでブロックされたスレッドの数がバリアの最大スレッド数に達するまで各スレッドをブロックします。この時点で、EnterSynchronizationBarrier はすべてのスレッドのブロックを解除します。 EnterSynchronizationBarrier 関数は、バリアに入ったスレッドの 1 つだけに対して TRUE を返し、他のすべてのスレッドに対して FALSE を返します。
不要になった同期バリアを解放するには、 DeleteSynchronizationBarrier を呼び出します。 EnterSynchronizationBarrier を呼び出した直後にこの関数を呼び出しても問題ありません。その関数は、解放される前にすべてのスレッドがバリアの使用を完了していることを保証するためです。
同期バリアが削除されない場合、スレッドはバリアに入ったときに SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE フラグを指定できます。 バリアを使用するすべてのスレッドは、このフラグを指定する必要があります。スレッドがない場合、フラグは無視されます。 このフラグにより、関数は削除の安全性に必要な余分な作業をスキップするため、パフォーマンスが向上する可能性があります。 このフラグが有効な間にバリアを削除すると、ハンドル アクセスが無効になり、1 つ以上のスレッドが完全にブロックされる可能性があることに注意してください。