Unix系だとスレッドライブラリとしてpthreadsが有名です。これを使ったプログラムをWindows APIへ移植するにあたって、条件変数をどうしたらよいかと悩んだので、その記録です。
もちろん、Windows Vista以降であれば条件変数が使えます。しかし、XPなんかも対象にしたくて、イベントオブジェクトなどで書き換えようというわけです。余計なライブラリの依存を増やしたくなかったので、Win32用pthreadsなんかも今回は不採用としました。
何か参考になる情報はないかと探しているときに見つけたのが、MSDNマガジンのWindows Vista の新しい同期プリミティブでした。イベントオブジェクトを使った場合と条件変数を使った場合のコードが載っていたので、それを見比べて逆にイベントオブジェクトを使ったコードへ書き換えたのでした。
今回、条件変数を使う方法とイベントオブジェクトを使う方法は、次の点で異なると理解しました。
- 条件変数での待機では、「ロックを解除→待機→再びロック」をアトミックに行える(ただし、そうでないと困る場面にまだ遭遇していない)。
- イベントオブジェクトに対する待機は、ロックを獲得せずとも可能。
- Windows/pthreadsの条件変数は、待機しているスレッドすべてに起こすか、1つだけ起こすかの制御が関数を呼び分けるだけで実現できる。Windowsのイベントオブジェクトだと、オブジェクト作成時に自動リセット・手動リセットという分類で決めることになる(おそらく、自動リセットイベントでがんばれば全スレッド起こしもできると思うが、面倒だろう)。
スポンサード リンク |