2017-01-27 5 views
1

条件変数を待っていると、ループによってCPUコアが命令で100%ロードされますか?これはCVARで待機しているが、通常はC++でどのように行われるかされています条件変数でCPUコアをロードするのを待っていますか?

void worker_thread() 
{ 
    // Wait until ready turns true and the condition variable is notified 
    std::unique_lock<std::mutex> lk(m); 
    cv.wait(lk, []{return ready;}); //<-- does this load the cpu? 
    // Do something 
} 

私はこのようなものが基本となる実装であると仮定します。

while (1) 
{ 
    lock mutex; 
    if (condition) signal(); 
    unlock mutex; 
} 

このコードは、それが100に実行されているプロセッサ・コアをロードします%はSleep()がないためです。

実際にはどうなりますか?

+1

シグナルの状態を確認するために常にポーリングするのではなく、状態が通知されるまで、ポーリングすることはありません。シグナルを使ってスレッドを同期させるのはかなり効率的です。 – seccpur

+1

C++標準でスレッドをCPUから取り除く必要があるとは言わないので、実装に依存していると思います。 – AndyG

+0

任意の正常な実装では、wait()呼び出しはスレッドスケジューラと連携して実装されます。すなわち、条件変数が通知されるまで、呼び出しスレッドはスリープ状態に入る。シグナルが発生すると、スレッドスケジューラはスレッドを再び起動させ、wait()が戻るようにします。スレッドがスリープしている間は、余分なCPUサイクルは使用されません。 –

答えて

1

私が使用したコンパイラおよびOSの中で、これは使用していません。通常、同期プリミティブの基礎となる操作は、明示的に宣言されていない限りカーネル呼び出しとして実行され、OSのカーネルはその操作方法を気にします。もしそれが標準ではないとしても、エキゾチックなアーキテクチャ上にC++標準に準拠したコンパイラが存在することを許すことしかないと思います。あなたが本当にまれで特異的なものを使用しているのでなければ、それに気を付けるべきではありません。

1

一般に、このロジックはimplementation of scheduler in OSを中心としています。

スレッドの待ち受け機能は、OSのスケジューラと連携して行います。

汎用/シンプルなデザイン: In the mentioned scenario、待つスレッドがスリープ状態にせなければならないし、特定の条件がある場合を除き、したがって、スケジューラが待機/ブロックされた状態(キュー待ち)の状態(実行キュー)を実行しているからスレッドを移動しなければなら会ったしたがって、通常このシナリオでは、CPUサイクルの消費がない可能性があります。

条件が満たされると、セマフォはスケジューラを親密にして、スケジューラが条件を待っていたスレッドを起動してスケジューリングできるようになります(つまり、スレッドは待機/ブロック状態から移動しますキュー)を実行状態(実行キュー)に変更してスケジュールします)。

関連する問題