背景
さて、私はいくつかの優先度が高いとしましょう(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をより多く消費します(優先度の低いスレッドと比較して)?
最高の優先度のスレッドがリージョンに入るときについて知っておく必要があるパフォーマンスへの影響はありますか。優先度の低いスレッドが領域に入ろうとしていますか?
この状況でよく知られている問題は 優先度の逆転 です。低優先度のスレッドがロックを保持している場合、高優先度のスレッドが長時間待機する可能性があります(中優先度のスレッドが予定されています)。しかし、オペレーティングシステムの作成者はこれを認識しており、 解決策がある傾向があります です。
たとえば、領域でビジー状態のスレッドが他にあるため、最も優先度の高いスレッドがmyLockを取得できないとしましょう。
ThreadPriority.Highest
領域に入ろうとすると、CPUをより多く消費します(優先度の低いスレッドと比較して)?
いいえ、ロックを取得するプロセスはスレッドの優先順位に依存しません。ロックがかかると、スレッドはCPUをあまり消費せず、すぐにスリープ状態に移行します。