2012-02-18 11 views
4

具体的には、コンテキスト切り替えのパフォーマンス低下は、待機状態にあるスレッドに適用されますか?ManualResetEventは待機中にCPUを消費しますか?

ManualResetEventまたはWaitHandleがリソースを消費する可能性がある条件または状況はありますか?

+0

この質問への回答がここに表示されることを期待していますか、[他の質問](http://stackoverflow.com/questions/9343358/is-this-background-thread-queue-a-performant-implementation )あなたは今日(同じ質問を含んでいます)投稿しましたか? –

+1

この状況がどのような状況にあるかを理解するには、ここでコードサンプルを少し必要とします。 – JaredPar

+2

さて、その質問は受け入れられないと思われたので、私はこれを正しくしようとしています。 –

答えて

5

ManualResetEventには待機状態がありません。 MREで待機できるのは、スレッドです。そして、スレッドは、実行されたことを実行していないときにコードを実行するときに、不必要に多くの貴重なリソースを消費します。 1メガバイトの仮想メモリといくつかのカーネルオブジェクト。 MREが消費する単一のカーネルオブジェクトは、それに比べて小さなジャガイモです。

通常、代わりにスレッドプールスレッドを使用します。

.NET 4.0で利用できるものを見てください。 ManualResetEventSlim(OSオブジェクトに基づかない)やTaskクラスなど。

+0

ManualResetEventSlimをご参照いただきありがとうございます。私はこれが存在することさえ知りませんでした。私たちが待っているよりもスピンを上げるほうが良い例があります。 –

2

ManualResetEventの場合、いいえ。スレッドは実際にはループしていません。これは、ManualResetEventの通知リストに埋め込まれている参照を取得したばかりです。他のスレッドがManualResetEventを呼び出すと、その別のスレッドは待機スレッドをアクティブキューに戻します。

消費されるリソースは、スレッド、つまりカーネルリソースが記録されているもの、保存されているレジスタなど、スレッドの存在を考慮したものにすぎません。今話していたスレッドがManualResetEventを使用していなかったいくつかの種類の待ちループ、そして確かに。

今、WaitHandleは実装ではありません。それはちょうど抽象的なAPIです。 WaitHandleの他の実装がうまくいくかどうかは分かりません。

関連する問題