MENU

【C++】”thread”ライブラリによるマルチスレッドプログラミング

目次

マルチスレッドとは

マルチスレッドとは、プログラムが複数のスレッドを持ち、それぞれが独立して並行に実行される処理方式のことを指します。スレッドはプロセスの一部であり、同じプロセス内でメモリ空間を共有しながら動作します。

マルチスレッドの特徴

並行処理

複数のタスクを同時に実行することで、プログラムの処理速度を向上させることができます。特にマルチコアプロセッサを利用する場合、各コアで異なるスレッドを実行することが可能です。

リソースの共有

スレッドは同じプロセスのメモリ空間を共有するため、データのやり取りが高速で行えます。

応答性の向上

ユーザーインターフェースとバックグラウンド処理を分離することで、アプリケーションの応答性が向上します。

まとめると、コンピュータの処理をマルチスレッドで実行することによって、以下のようなメリットがあります。

  • 性能の向上
  • リソースの効率的利用
  • 応答性の向上

サンプルコード

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、セマフォなど)が必要です。

排他制御については以下の記事で解説しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

20代の組み込みソフトウェアエンジニア
主な使用言語はC++

---------------------資格---------------------
応用情報技術者
ネットワークスペシャリスト

目次