コンテンツにスキップ

Thread#

スレッドとは、コンピュータによる並列処理を指します。

逐次実行では時間がかかってしまうタスクに対して並列化を行うことで効率的にCPUリソースを使用することができるようになります。

数学・理科・英語の3教科の宿題があなたに与えられていると仮定して、逐次処理が順番に解くとすれば、並列処理であれば定時毎に解く宿題を変更していきます。


簡単なスレッド#

まずは、簡単なスレッドを示します。

以下のプログラムでは、std::threadクラスを使用して、hello関数を別スレッドで実行しています。

hello関数は、1秒間スリープしてからHello, world!と出力して変数aをインクリメントしています。

mainでは全てのスレッドをdetachした後に、変数aが5になるまで待機しています。

スレッドでは、joinを使用すると、スレッドが終了するまで待機することができます。

detachを使用すると、終了待ちをせずにスレッドを実行します。

#include <iostream>
#include <thread>
#include <chrono>

int a = 0;
void hello()
{
    // sleep 1
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Hello, world!" << std::endl;
    a++;
}

int main()
{
    for (int i = 0; i < 5; i++) {
        std::thread t(hello);

        // t.join();
        t.detach();
    }
    // wait for all done
    while (a < 5) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

コンパイルには、-pthreadオプションを付けてください。

g++ main.cpp -pthread


1秒後にHello, world!が5回出力されます。