マルチスレッドとは
マルチスレッドとは、プログラムが複数のスレッドを持ち、それぞれが独立して並行に実行される処理方式のことを指します。スレッドはプロセスの一部であり、同じプロセス内でメモリ空間を共有しながら動作します。
マルチスレッドの特徴
- 並行処理
-
複数のタスクを同時に実行することで、プログラムの処理速度を向上させることができます。特にマルチコアプロセッサを利用する場合、各コアで異なるスレッドを実行することが可能です。
- リソースの共有
-
スレッドは同じプロセスのメモリ空間を共有するため、データのやり取りが高速で行えます。
- 応答性の向上
-
ユーザーインターフェースとバックグラウンド処理を分離することで、アプリケーションの応答性が向上します。
まとめると、コンピュータの処理をマルチスレッドで実行することによって、以下のようなメリットがあります。
- 性能の向上
- リソースの効率的利用
- 応答性の向上
サンプルコード
C++の標準ライブラリの<thread>
を使って、簡単なマルチスレッドプログラミングをしてみましょう。
2つのスレッドで並行して計算を行うプログラム
#include <iostream>
#include <thread>
// スレッドで実行する関数
void threadFunction(int threadNumber) {
for (int i = 0; i < 5; ++i) {
std::cout << "Thread " << threadNumber << " is running. Iteration: " << i << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 100ミリ秒待機
}
}
int main() {
// スレッドオブジェクトの作成と開始
std::thread thread1(threadFunction, 1);
std::thread thread2(threadFunction, 2);
// スレッドの完了を待つ
thread1.join();
thread2.join();
std::cout << "Both threads have finished execution." << std::endl;
return 0;
}
ヘッダのインクルード
#include <iostream>
#include <thread>
<iostream>
は標準入出力ストリームを扱うために使用し、<thread>
はスレッドを扱うために使用します。
スレッド関数の定義
void threadFunction(int threadNumber) {
for (int i = 0; i < 5; ++i) {
std::cout << "Thread " << threadNumber << " is running. Iteration: " << i << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 100ミリ秒待機
}
}
ここでは、スレッドごとに実行する関数threadFunction
を定義しています。threadNumber
はスレッド番号を示します。
スレッドの作成と開始
std::thread thread1(threadFunction, 1);
std::thread thread2(threadFunction, 2);
2つのスレッドを作成し、それぞれにthreadFunction
を渡して開始しています。第2引数はスレッド番号です。
スレッドの完了を待機
thread1.join();
thread2.join();
join()
メソッドを呼び出すことで、スレッドの終了を待ちます。これにより、両方のスレッドが完了してから次に進みます。
実行結果
このプログラムを実行すると、標準出力に以下のようなメッセージが出ます。2つのスレッドが同時に実行されていることがわかります。
Thread Thread 2 is running. Iteration: 0
1 is running. Iteration: 0
Thread 1 is running. Iteration: 1
Thread 2 is running. Iteration: 1
Thread 1 is running. Iteration: 2
Thread 2 is running. Iteration: 2
Thread 2 is running. Iteration: 3
Thread 1 is running. Iteration: 3
Thread 2 is running. Iteration: 4
Thread 1 is running. Iteration: 4
Both threads have finished execution.
さいごに
マルチスレッド化には様々なメリットがありますが、複数のスレッドが同時に動作する関係上、設計やデバッグの難易度は上がります。マルチスレッド化の難しさとして、代表的なのは排他制御です。複数のスレッドが同じリソースにアクセスする際、競合状態が発生する可能性があるため、適切な同期機構(Mutex、セマフォなど)が必要です。
排他制御については以下の記事で解説しています。