2

MSDNを検索しましたが、Mutexは2回ロックされる可能性がありますが、同じスレッドで同じイベントオブジェクトを2回再帰的に取得するという言葉はありません。

同じスレッドでwin32イベントを2回ロックできますか?

編集:ロックイベントの意味は何ですか?ここでは、イベントが自動リセットされていると想定しています。

  1. ロック:スレッドはWaitForXXXからウェイクアップされます(例:WaitForSingleObject)
  2. ロック解除:スレッドがSetEventまたはPluseEventを呼び出しています。
4

2 に答える 2

4

ミューテックスは、イベントとは根本的に異なります。ミューテックスは相互排除を提供するために使用されるため、一度に1つのスレッドのみがリソースにアクセスできますが、イベントは単なる通知メカニズムです。自動リセットイベントは単一のウェイクアップ通知を提供しますが、手動リセットイベントは複数のウェイクアップ通知を提供します。

自動リセットイベントを通知すると、1つのスレッドのみがその信号を受信し、そのスレッドは1回だけ受信します。他のスレッド---または同じスレッドからのそのイベントの待機関数への他の呼び出し---への2番目の呼び出しがあるまで待機しSetEventます。

手動リセットイベントを通知すると、リセットするまで通知されたままになるため、複数のスレッドがウェイクアップでき、同じスレッドからのそのイベントの待機関数への複数の呼び出しは、一部のスレッドが呼び出すまで成功しますResetEvent

イベントにはどちらの方法でも「所有者」はありません。スレッドAが、イベントを設定する別のスレッドによって前回待機関数の呼び出しから起こされたという理由だけで、イベントを再び待機することを妨げるものはなく、スレッドかどうかを指定するものもありません。両方が同じ自動リセットイベントを待機している場合、AまたはBがウェイクアップされます。また、特定のスレッドを呼び出す必要はありませんSetEvent。システム内のどのスレッドも、そのスレッドがそのイベントの待機関数を呼び出すかどうかに関係なく、呼び出すことができます。実際、一般的なユースケースでは、1つのスレッドが呼び出しSetEvent、1つ以上の他のスレッドが待機しています。

つまり、はい、そのイベントを待機したばかりのスレッドからのイベントを待機できますが、これはロックではなく、他のスレッドもイベントを待機し、イベントが通知された場合にウェイクアップする可能性があります。

編集された質問の更新:

イベントを使用してロックを提供できますが、それは固有のセマンティクスの一部ではありません。WaitForSingleObject同じ自動リセットイベントハンドルを使用して、連続して2回呼び出すことができます。これは、Windowsに関する限り、エラーではありません。SetEvent待機中のスレッドが最初の呼び出しから2番目の呼び出しが発生するWaitForSingleObject前にウェイクアップするように、他の1つまたは複数のスレッドが2回呼び出されるようにする必要があります。 SetEvent「失われた」ウェイクアップを回避SetEventします。呼び出しはカウントされず、フラグを設定するだけです。

また、使用しないでくださいPulseEvent。現在待機中のスレッドがある場合でも、スレッドがウェイクアップすることを保証するものではありません。

于 2012-04-23T08:06:36.083 に答える
2

私はアンソニー・ウィリアムズに同意します。

追加したいのは、多くの人(あなただけでなく)がミューテックスと自動リセットイベントの違いを完全に理解していないということです。これらは実際には同様に動作、(技術的な観点から)リソースのロックに使用できます。

それらの主な違いは、ミューテックスがどのスレッドがそれを保持しているかを「知っている」ということです。つまり、WaitForSingleObject(または同様の)ミューテックスを取得すると、呼び出し元のスレッドに自動的に「割り当て」られます。これには2つの結果があります。

  1. Mutexは、同じスレッドによって再帰的に取得される場合があります。もちろん、これは自動リセットイベントでは機能しません。
  2. ミューテックスを所有するスレッドが終了すると、ミューテックスは自動的に「解放」されます。適切なWaitXXXX関数は。で戻りWAIT_ABANDONEDます。

イベントOTOHは、セマフォの特定のケースと見なされる場合があります。自動リセットイベントは、(最大で)1で課金されるセマフォと同等であり、手動リセットイベントは、無限に課金されるセマフォと同等です。

于 2012-04-23T08:22:48.580 に答える