web-dev-qa-db-ja.com

スレッドの優先度が最も高い場合はMonitor.Enter()

背景

さて、私はいくつかの優先度が高いとしましょう(ThreadPriority.Highest)スレッドtは、一部のデータを消費するためにクリティカル領域に入る必要があります。私のポイントを説明するために、次のコードスニペットを使用します。

// create a consumer thread
t = new Thread(() =>
{
    Monitor.Enter(myLock);

    // consume data

    Monitor.Exit(myLock);
});
t.Name = "Data Consumer";
t.Priority = ThreadPriority.Highest;
t.Start();

上記の例では、スレッドはデータを消費するために領域を入力しようとします(ロックが使用可能な場合)。

質問

最高の優先度のスレッドがリージョンに入るときについて知っておく必要があるパフォーマンスへの影響はありますか。優先度の低いスレッドが領域に入ろうとしていますか?

たとえば、領域でビジー状態になっている他のスレッドがあるため、最も優先度の高いスレッドがmyLockを取得できないとしましょう。 ThreadPriority.Highest領域に入ろうとすると、CPUをより多く消費します(優先度の低いスレッドと比較して)?

4
Snoop

最高の優先度のスレッドがリージョンに入るときについて知っておく必要があるパフォーマンスへの影響はありますか。優先度の低いスレッドが領域に入ろうとしていますか?

この状況でよく知られている問題は 優先度の逆転 です。低優先度のスレッドがロックを保持している場合、高優先度のスレッドが長時間待機する可能性があります(中優先度のスレッドが予定されています)。しかし、オペレーティングシステムの作成者はこれを認識しており、 解決策がある傾向があります です。

たとえば、領域でビジー状態のスレッドが他にあるため、最も優先度の高いスレッドがmyLockを取得できないとしましょう。 ThreadPriority.Highest領域に入ろうとすると、CPUをより多く消費します(優先度の低いスレッドと比較して)?

いいえ、ロックを取得するプロセスはスレッドの優先順位に依存しません。ロックがかかると、スレッドはCPUをあまり消費せず、すぐにスリープ状態に移行します。

1
svick