std::thread: マルチスレッドプログラミング

並列実行で性能向上。C++11標準スレッド。

std::thread
実行スレッドを表すクラス。
join
スレッド終了を待つ。
detach
スレッドを切り離す。

スレッドとは?

厨房のシェフ (Kitchen Chefs)

プログラムは通常、1人のシェフ(メインスレッド)が全て調理します。スレッドを増やすのは「シェフを増員」することです。1人が野菜を切り(別スレッド)、もう1人が肉を焼けば(並列実行)、料理は早く完成します。ただし、最後に盛り付けるためにタイミングを合わせる(join)必要があります。

`std::thread` はOSのネイティブスレッドを扱うクラスです。スレッドを作成すると即座に実行が始まります。親スレッドは必ず子スレッドの終了を待つ(join)か、切り離す(detach)か選ばなければなりません。忘れるとプログラムがクラッシュします(C++20の `jthread` なら自動で join してくれます)。

Basic Thread
#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++20
std::jthread t(work); // 自動で join

パターン

Thread Patterns
// ラムダでスレッド作成
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: 並列計算
配列を複数スレッドで並列処理してください。

次のステップ