EnterSynchronizationBarrier 関数 (synchapi.h)
呼び出し元のスレッドが同期バリアで待機し、スレッドの最大数がバリアに入るまで待機します。
構文
BOOL EnterSynchronizationBarrier(
[in, out] LPSYNCHRONIZATION_BARRIER lpBarrier,
[in] DWORD dwFlags
);
パラメーター
[in, out] lpBarrier
初期化された同期バリアへのポインター。 バリアを初期化するには、 InitializeSynchronizationBarrier 関数を使用します。 SYNCHRONIZATION_BARRIER は、アプリケーションで変更すべきではない不透明な構造です。
[in] dwFlags
このバリアに入るスレッドの動作を制御するフラグ。 このパラメーターには、次の値のうち 1 つ以上を指定できます。
値 | 意味 |
---|---|
SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY | バリアに入るスレッドが、最後のスレッドがバリアに入るまですぐにブロックする必要があることを指定します。 詳細については、「解説」を参照してください。 |
SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY | バリアに入るスレッドがバリアの最大スピン数を超えた場合でも、最後のスレッドがバリアに入るまでスピンすることを指定します。 詳細については、「解説」を参照してください。 |
SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE | バリアを安全に削除できるように、関数が必要な作業をスキップできることを指定します。これにより、パフォーマンスが向上します。 このバリアに入るスレッドはすべて、 フラグを指定する必要があります。それ以外の場合、フラグは無視されます。 このフラグは、バリアが削除されない場合にのみ使用する必要があります。 |
戻り値
TRUE
最後のスレッドがバリアを通知します。 最後のスレッドが の戻り値 FALSE
を受け取る前にバリアを通知するスレッド。
注釈
同期バリアに入るスレッドの既定の動作は、バリアの最大スピン数に達するまでスピンしてからブロックすることです。 これにより、最後のスレッドが比較的短い時間でバリアに入った場合に、スレッドを迅速に再開できます。 ただし、最後のスレッドが到着するまでに比較的長い時間がかかる場合、スレッドは既にバリア ブロック内に存在するため、待機中にプロセッサ時間の消費が停止します。
スレッドは、SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLYまたはSYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLYを指定することで、バリアの既定の動作をオーバーライドできます。 ただし、これらのフラグを使用するとパフォーマンスに影響を与える可能性があることに注意してください。 スピンを無期限に行うと、プロセッサが他のスレッドにサービスを提供できなくなりますが、早期ブロックでは、スレッドをプロセッサからスワップし、ブロックを解除したときにスレッドを起動し、もう一度プロセッサにスワップするオーバーヘッドが発生します。 一般に、バリアがスレッドを管理し、これらのフラグを使用するのは、アプリケーションがそれらの恩恵を受ける可能性があることをパフォーマンス テストが示している場合にのみ行うことをお勧めします。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8 [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server 2012 [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | synchapi.h |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |