pthread_cond_broadcast を呼び出して、条件を待っている人がいない場合、pthread_cond_broadcast はコンテキスト スイッチを呼び出したり、カーネルを呼び出したりしますか?
そうでない場合、非常に高速であることに依存できますか(高速とは、現在のプロセスで少数のアセンブリ命令を実行してから戻ることを意味します)?
pthread_cond_broadcast を呼び出して、条件を待っている人がいない場合、pthread_cond_broadcast はコンテキスト スイッチを呼び出したり、カーネルを呼び出したりしますか?
そうでない場合、非常に高速であることに依存できますか(高速とは、現在のプロセスで少数のアセンブリ命令を実行してから戻ることを意味します)?
POSIX には保証はありませんが、質問にタグが付けられているため、そのコンテキストlinuxでnptlの回答を提供できます。
条件変数に待機者がいない場合、nptl glibc コードpthread_cond_broadcast()
は、条件変数自体の内部を保護する低レベル ロックを取得し、値をテストしてから低レベル ロックのロックを解除します。低レベルのロック自体は、そのロックに競合がある場合にのみカーネルに入る futex を使用します。
これは、条件変数自体に多くの競合がない限り (つまり、多数のスレッドが同じ条件変数でpthread_cond_broadcast()
/pthread_cond_signal()
を頻繁に呼び出している場合)、カーネルへのシステム コールは発生せず、オーバーヘッドはわずかになることを意味します。ロックされた指示。
pthread
Open Group Base Specifications には次のように記載されています。
で現在ブロックされているスレッドがない場合、 および 関数は効果がありませ
pthread_cond_broadcast()
ん。pthread_cond_signal()
cond
これが「少数のアセンブリ [ sic ] 命令を実行するだけ」で済むかどうかを判断するには、ランタイム パフォーマンス分析ツール (IBM の Quantify など) を入手して、コードに対して実行する必要があります。