2012-02-21 8 views
7

私は6スレッドを持っています。 スレッドの1つがスコープ内に入り、 'ロック'をオンにし、他のすべてのスレッドが待機しており、同じスコープに入ることを望みます。「ロック」はCPU時間を要していますか?

他のスレッドはCPU時間を取得していますか?他のスレッドはスレッドスケジュールに入っていますか? 他のすべてのスレッドが待機状態にあることを理解していますが、CPUはスレッドを継続してスコープに入れようとします(スコープにアクセスできない場合でも)

+1

私の理解では、他のスレッドはタイムスライスを受け取り、ロックの状態をチェックするために使用します。ロックがまだ行われていれば、スリープ状態に戻ります。 – xbonez

+0

これも私が理解したものですが、これにはCPU時間がかかってしまいます...これは一種の忙しい待機です - これは非常に悪いことです。 – Yanshof

答えて

10

ロックを入力しようとすると既に取られたスレッドはしばらくの間最初にスピンロックし、最後に一時停止して待機状態に入る。

CPUがスピンしている間にCPU時間を消費しますが、待機しなくなります。

+6

少し拡張する:spinwaitはカーネル遷移よりも安価であるため、ロックが軽く競合する場合に最適化されるため、spinwaitが実行されます。 – Richard

+0

スピンロックとは何ですか?あなたは1文で答えることができますか? –

+2

@Royiスレッドは、ルックで見た目が自由であるかどうかをチェックし続けます。 'while(!lock.TryEnter()){}'のようなものはCPUを焼くが、カーネルの移行やスレッドのスケジューリングのオーバーヘッドは避ける。ロックがすぐに解放されるのは良いことですが、時間がかかると悪くなります。だから、「ロック」がしばらくスピンロックしてから待っているのです。 – CodesInChaos

0

これはロックの仕組みではありません。あなたは誰にも "cpu時間"を与えません。ロックしている場合、スレッドがお互いを待っている待機時間とデッドロックが発生する可能性があります。

関連する問題