ミューテックスは、イベントとは根本的に異なります。ミューテックスは相互排除を提供するために使用されるため、一度に1つのスレッドのみがリソースにアクセスできますが、イベントは単なる通知メカニズムです。自動リセットイベントは単一のウェイクアップ通知を提供しますが、手動リセットイベントは複数のウェイクアップ通知を提供します。
自動リセットイベントを通知すると、1つのスレッドのみがその信号を受信し、そのスレッドは1回だけ受信します。他のスレッド---または同じスレッドからのそのイベントの待機関数への他の呼び出し---への2番目の呼び出しがあるまで待機しSetEvent
ます。
手動リセットイベントを通知すると、リセットするまで通知されたままになるため、複数のスレッドがウェイクアップでき、同じスレッドからのそのイベントの待機関数への複数の呼び出しは、一部のスレッドが呼び出すまで成功しますResetEvent
。
イベントにはどちらの方法でも「所有者」はありません。スレッドAが、イベントを設定する別のスレッドによって前回待機関数の呼び出しから起こされたという理由だけで、イベントを再び待機することを妨げるものはなく、スレッドかどうかを指定するものもありません。両方が同じ自動リセットイベントを待機している場合、AまたはBがウェイクアップされます。また、特定のスレッドを呼び出す必要はありませんSetEvent
。システム内のどのスレッドも、そのスレッドがそのイベントの待機関数を呼び出すかどうかに関係なく、呼び出すことができます。実際、一般的なユースケースでは、1つのスレッドが呼び出しSetEvent
、1つ以上の他のスレッドが待機しています。
つまり、はい、そのイベントを待機したばかりのスレッドからのイベントを待機できますが、これはロックではなく、他のスレッドもイベントを待機し、イベントが通知された場合にウェイクアップする可能性があります。
編集された質問の更新:
イベントを使用してロックを提供できますが、それは固有のセマンティクスの一部ではありません。WaitForSingleObject
同じ自動リセットイベントハンドルを使用して、連続して2回呼び出すことができます。これは、Windowsに関する限り、エラーではありません。SetEvent
待機中のスレッドが最初の呼び出しから2番目の呼び出しが発生するWaitForSingleObject
前にウェイクアップするように、他の1つまたは複数のスレッドが2回呼び出されるようにする必要があります。 SetEvent
「失われた」ウェイクアップを回避SetEvent
します。呼び出しはカウントされず、フラグを設定するだけです。
また、使用しないでくださいPulseEvent
。現在待機中のスレッドがある場合でも、スレッドがウェイクアップすることを保証するものではありません。