条件変数を待っていると、ループによって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()がないためです。
実際にはどうなりますか?
シグナルの状態を確認するために常にポーリングするのではなく、状態が通知されるまで、ポーリングすることはありません。シグナルを使ってスレッドを同期させるのはかなり効率的です。 – seccpur
C++標準でスレッドをCPUから取り除く必要があるとは言わないので、実装に依存していると思います。 – AndyG
任意の正常な実装では、wait()呼び出しはスレッドスケジューラと連携して実装されます。すなわち、条件変数が通知されるまで、呼び出しスレッドはスリープ状態に入る。シグナルが発生すると、スレッドスケジューラはスレッドを再び起動させ、wait()が戻るようにします。スレッドがスリープしている間は、余分なCPUサイクルは使用されません。 –