Chiharu の日記

絵描き C/C++ プログラマーの日記です。

条件変数 〜Win32API の場合

POSIX スレッド API には pthread_cond_t 型で提供される条件変数という機能があるのですが、Win32API では Vista になるまで当該機能が存在しなかったという話です。

条件変数は、他のスレッド ライブラリには以前から含まれていましたが、残念ながら Windows SDK にはこれまで含まれていませんでした。条件変数は基本的に、なんらかの条件テストの結果に基づいてスレッドのグループを同期させるために使用されます。この動作は既存の同期構造の組み合わせによっても実現できますが、条件変数では、取得したロックを解放してスリープ状態に入るタスクを 1 つのアトミック操作で行うことができます。また、目的の動作をよりわかりやすく間違えにくい方法で実装できます。

MSDN マガジンのバックナンバー

Vista より前の Win32API では CreateEvent で生成可能なイベント オブジェクトがこれに近いかなぁと思っていましたが、1 イベント オブジェクトあたりでシグナル状態を取得できる待機スレッドは 1 つだけという制約があるようです。実際にコーディングして動作確認したところ、イベントのシグナル状態を 1 アクションで複数スレッドにブロードキャストすることはできないようでした。
POSIX スレッド API に置き換えて考えると、pthread_cond_signal はあるが pthread_cond_broadcast はない、という感じ。
今更こんな初歩を調べたのは『Parallel force - パラレル・フォース』のプロデューサ コンシューマ パターン的な動作について、ワーカースレッドごとに寝起き用のイベント オブジェクトを操作するのもどうなんだろうと、思い至ったためです。コンシューマをたたき起こすのに、プロデューサが SetEvent を CPU コア数分だけ叩いているので。なんだか無駄があるような気がしてしまって。
―――んー。マルチ プラットフォームをやると色々気になりますね。