覚書。
前から謎だった件。
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