std::thread: マルチスレッドプログラミング
並列実行で性能向上。C++11標準スレッド。
std::thread
実行スレッドを表すクラス。
join
スレッド終了を待つ。
detach
スレッドを切り離す。
スレッドとは?
`std::thread` はOSのネイティブスレッドを扱うクラスです。スレッドを作成すると即座に実行が始まります。親スレッドは必ず子スレッドの終了を待つ(join)か、切り離す(detach)か選ばなければなりません。忘れるとプログラムがクラッシュします(C++20の `jthread` なら自動で join してくれます)。
#include <thread>#include <iostream>
void worker(int id) { std::cout << "Thread " << id << " running";}
int main() { std::thread t1(worker, 1); std::thread t2(worker, 2);
t1.join(); // 終了を待つ t2.join();
return 0;}実行結果
Thread 1 running\nThread 2 running\n(順序は不定)
Bad
// ❌ Bad: join/detach を忘れるstd::thread t(work);// t がスコープ外に出ると std::terminate!Good
// ✅ Good: RAII で安全に#include <jthread> // C++20std::jthread t(work); // 自動で joinパターン
// ラムダでスレッド作成std::thread t([](int x) { std::cout << x << "";}, 42);
// 参照を渡すint result = 0;std::thread t([&result]() { result = compute();});t.join();
// スレッド数を取得unsigned int n = std::thread::hardware_concurrency();
// detach: バックグラウンド実行std::thread daemon(background_task);daemon.detach(); // 切り離す Tip: C++20 の std::jthread は自動で join。推奨。
合格ライン
join と detach の違いを説明できる
ラムダでスレッドを作成できる
参考リンク
演習課題
課題1: スレッド作成
ラムダ式でスレッドを作成し、join で待機してください。
課題2: 並列計算
配列を複数スレッドで並列処理してください。