2011-08-10 2 views
1

対私はRegisterWaitForSingleObjectに読んだ: http://www.albahari.comRegisterWaitForSingleObjectはAutoResetEvent

そして、私はRegisterWaitForSingleObject AutoResetEventを使用していないことを好むだろうというとき、私は理解していませんか?

RegisterWaitForSingleObjectは、常にスレッドに関連付けられていないため、AutoResetEventより優れていると思われます。

答えて

3

リンゴとオレンジを比較しています。 RWFSOには待機ハンドルが必要です。 AutoResetEventと同様です。 RWFSOが行うことは、がイベントのためにを待つことを最適化することです。それがなければ、イベントのWaitXxx()メソッドを呼び出す必要があります。

イベントを設定するまで、WaitOne()はスレッドをブロックします。ブロックされたTPスレッドは他のスケジュールされたTPスレッドがすぐに実行されないため、これはスレッドプールスレッドでは避けたいものです。スレッドプールマネージャは、実行中のTPスレッドの数を最適化して、CPUコアよりも実行中のTPスレッドがないようにします。ブロッキングスレッドは、それをねじにしてしまいます。マネージャは、スレッドがなぜブロックしているのかを知るのに十分スマートではありません。ブロッキングTPスレッドが半秒間進まない場合にのみ、マネージャーは別の待機TPスレッドの実行を許可します。

RWFSOはかなりいいですが、必ずしも適切ではありません。それを使ったプログラミングは、特に例外を処理したい場合には、かなり厄介です。あなたがそれをキャンセルする必要があるならば、厄介な暗黙のレースがあります。イベントが通知されたときに実行されるTPスレッドは、同じ種類のTPスケジューリング遅延の影響を受けます。また、RegisterWaitForMultipleObjects()もなく、スレッドでWaitAny()を使用する必要があることがよくあります。直観的には、スレッドに何か準備ができていることを通知するイベントが1つあり、終了するようにスレッドに指示する別のイベントです。

関連する問題