WaitForSingleObjectのシグナル状態について


しんすけ  2010-08-11 09:52:39  No: 38974  IP: [192.*.*.*]

WaitForSingleObject関連でお聞きしたいのですが、シグナル状態と非シグナル状態の定義がいまいちわかりません。

例えば3つのスレッドがアクセスしてその各Handleのシグナル状態をWaitForSingleObjectで監視しているとします。

スレッド1の処理  →  スレッド2の処理(WaitForSingleObject-1)
→  スレッド3処理(WaitForSingleObject-2)
という流れだとします。

スレッド1処理でまだアクセス権がリリースされていない状態で2つめが入ってきた場合はWaitForSingleObject-1は非シグナル状態であるのはわかります。
その間に3つめのスレッドが来た場合WaitForSingleObject-2も非シグナル状態であり、WaitForSingleObject-2で待ち処理になると思いますが、
最初のスレッドがリリースされた場合、WaitForSingleObject-1だけシグナル状態になり待ち状態が終わりますよね。WaitForSingleObject-2は待ち続け、スレッド2の処理がリリースされたら、WaitForSingleObject-2待ちが終わると思います。

これはどういった流れでそうなっているのでしょう。前の処理の終了を見てシグナル、非シグナルを決めているのでしょうか?最初はスレッド1が終わった時点でスレッド2、スレッド3がはしってしまうのでは?というイメージがありました。

内部の動きがよくわかりません。
詳しい方、教えていただけますか?

よろしくお願いします。

編集 削除
tor  2010-08-11 13:02:29  No: 38975  IP: [192.*.*.*]

そもそもこれってDelphiの質問なの? という気はしますが……

WaitForSingleObjectで待っている対象は何ですか? イベント? プロセス? ミューテックス?
待ちが解除されたからといって自動的に非シグナルになるとは限りません。
どの条件で非シグナル状態になるかはオブジェクトにより異なります。
どのオブジェクトの場合にどうなるかはWaitForSingleObjectの説明で解説されているはずです。

実際に待ち解除で非シグナルになる可能性があるのは、見たところ自動リセットイベントとセマフォだけですね。
おそらくは前者のことを気にしているのだと仮定して回答しますが、
この場合、どの方法でイベントを発生させるか(SetEventからPulseEventか)で挙動が変わります。
複数のスレッドが同一イベントを待っている場合にどうなるかもそれぞれの関数で解説されているので、まずはその説明を調べてみてください。

編集 削除