はじめに
C++11以降、標準ライブラリ <thread> を使うことで、マルチスレッドプログラミングが言語レベルでサポートされるようになりました。これにより、重い計算処理などをバックグラウンドで行わせ、その間にユーザーインターフェースは応答可能な状態を保つ、といった並列処理を実装できます。
その中心となるのが std::thread クラスです。このクラスのオブジェクトを作成することで、新しいスレッドを起動し、指定した関数をメインスレッドとは独立して実行させることができます。
この記事では、std::thread を使って新しいスレッドを生成し、簡単なタスクを実行させる、最も基本的な方法を解説します。
std::thread を使ったサンプルコード
このコードは、worker_task という関数を、メインスレッド(main関数が実行されているスレッド)とは別の、新しいワーカースレッドで実行します。
完成コード
#include <iostream>
#include <thread> // std::thread を使うために必要
#include <chrono> // std::chrono を使うために必要
using namespace std;
// 1. 新しいスレッドで実行される関数
void worker_task() {
cout << "ワーカースレッド: 処理を開始します。" << endl;
// 処理に時間がかかることをシミュレート
this_thread::sleep_for(chrono::seconds(2));
cout << "ワーカースレッド: 処理を完了しました。" << endl;
}
int main() {
cout << "メインスレッド: ワーカースレッドを起動します。" << endl;
// 2. std::threadのコンストラクタに実行したい関数を渡して、スレッドを起動
thread worker(worker_task);
// メインスレッドは、ワーカースレッドの処理を待たずに独自の処理を続けられる
cout << "メインスレッド: ワーカースレッドが処理中でも、こちらは先に進みます。" << endl;
// 3. ワーカースレッドが終了するのを待つ (合流)
worker.join();
cout << "メインスレッド: ワーカースレッドが終了したので、プログラムを終了します。" << endl;
return 0;
}
実行結果(一例)
メインスレッド: ワーカースレッドを起動します。
メインスレッド: ワーカースレッドが処理中でも、こちらは先に進みます。
ワーカースレッド: 処理を開始します。
(約2秒後)
ワーカースレッド: 処理を完了しました。
メインスレッド: ワーカースレッドが終了したので、プログラムを終了します。
コードの解説
1. void worker_task()
新しいスレッド(ワーカースレッド)で実行させたい処理内容を記述した関数です。通常の関数と同じように定義します。
2. thread worker(worker_task);
この一行が、新しいスレッドを生成し、処理を開始する核心部分です。
thread worker(...):std::thread型のオブジェクトworkerを宣言しています。(worker_task): コンストラクタの引数として、実行したい関数worker_taskを渡します。
この行が実行された瞬間に、OSは新しいスレッドを生成し、そのスレッド上で worker_task 関数の実行が開始されます。main関数は、worker_task の完了を待たずに、すぐに次の行へ進みます。
3. worker.join();
.join() は、ワーカースレッドの処理が完了するまで、mainスレッドの実行を**待機(ブロック)**させるための重要なメソッドです。 もし join() を呼び出さずに main関数が終了してしまうと、worker_task が処理の途中であっても、プログラム全体が終了し、ワーカースレッドは強制的に中断されてしまいます。
std::thread オブジェクトは、破棄される(スコープを抜ける)前に、必ず .join()(待機)または .detach()(切り離し)のどちらかを呼び出さなければなりません。
まとめ
今回は、C++の std::thread を使って、新しいスレッドを作成する基本的な方法を解説しました。
<thread>ヘッダーをインクルードする。std::threadのコンストラクタに、実行したい関数を渡してオブジェクトを作成する。- 作成した
threadオブジェクトに対して、最後に.join()を呼び出し、スレッドの終了を待つ。
std::thread は、C++で並列処理を実現するための第一歩です。この基本をマスターすることで、応答性の高いUIアプリケーションや、計算処理の高速化など、より高度なプログラムを作成する道が開けます。
