覚書。

前から謎だった件。

std::threadであまり速度が速くならなかったので、オーバーヘッドだなと。

だとしたら、関数専用スレッドを作ったらから始まった。

 

while(true) ループでCPUが100%にならない?

結論:
    何も入っていないループはCPUを100%使います。
    しかし**「軽すぎて人間が気づかない」**のと、
    OSスケジューラが「ほぼ無駄な仕事」と判断して他スレッドに回すため、 あまり深刻に見えないことも多いです。

もし以下のように「本当に何もしていないループ」があれば:

while (!flag) {
    // 本当に何もしてない
}

これが何十万回/秒で回ってたら、当然CPUは忙殺されます。

対策:
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(1)); // 負荷を逃がす

あるいは std::condition_variable を使えば OS がちゃんと「寝かせてくれます」(これが次の 5 の話)。

5. condition_variable::wait の省エネ仕組みとは?

std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; });

このとき、スレッドは OS に「休ませてください」と伝えることになります。 → OSはスレッドを完全にスリープ状態に入れる
→ CPUリソースを一切使いません
つまり:

    ポーリングループ(busy wait):CPU酷使
    条件付きwait:CPUリソース0、めっちゃ省エネ

GUIアプリが多用するのはこの省エネ型です。
GUIの謎ループの中身も実はこう:

while (GetMessage(&msg, nullptr, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

→ GetMessage 内部が OSのwaitシステムコール で「新しいイベントが来るまで寝る」
→ CPUはアイドル状態。省エネです。

 まとめ
項目    ポイント
while(true) ループ    何もしないと100%CPU食う。軽い処理&OSの最適化で目立たないだけ
cv.wait()    スレッドを完全にスリープさせて省エネ

引用 ChatGPT