C++11のthreadで遊んでみる


このエントリーをはてなブックマークに追加

この記事は続き記事です。
第1回:この記事
第2回:C++11のthreadで遊んでみる その2 - mutex編 - minus9dの日記
第3回:C++11のthreadで遊んでみる その3 - condition_variable編 - minus9dの日記

    • -

C++11の標準ライブラリではスレッドのためのライブラリが追加されたという。これまでWindows系では_beginthreadex()、Linux系ではpthread_create()、などと関数を使い分ける必要があったのでうれしい。今回はC++11のスレッドライブラリを使って何ができるかを探ってみたいと思う。

参考にしたのは、書籍 C++ ポケットリファレンス。今のところどの日本語のウェブサイトよりもまとまった情報源だと思う。また、この書籍のサンプルコードがcpp-pocketref/sample-code · GitHubにて公開されている。

スレッドを作成

まずはスレッドを作ってスレッドのIDを表示するだけのプログラム。

#include <iostream>
#include <thread>

void worker() {
    std::cout << "thread id: " << std::this_thread::get_id() << std::endl;
}

int main() {
    std::thread th(worker);
    th.join();

    return 0;
}

実行例は以下の通り。

thread id: 0x80010328

ここでjoin()を呼び出してスレッドの終了を待機する処理を忘れてしまうと、実行時にエラーで落ちてしまうので注意。gccの場合のエラー例:

terminate called without an active exception
zsh: abort (core dumped)  ./a.exe

スレッドに引数を渡す

std::thread変数のコンストラクタに加えた引数が、そのままスレッドに渡される。とても簡単。

#include <iostream>
#include <thread>

void worker(int num1, int num2) {
    std::cout << num1 << std::endl;
    std::cout << num2 << std::endl;
}

int main() {
    std::thread th(worker, 10, 100);
    th.join();

    return 0;
}

実行例は以下の通り。

10
100

スレッドに参照渡ししたいときは、以下のように、引数をstd::ref()で包む。かつ、ワーカー関数の引数にも参照の&を付ける。

#include <iostream>
#include <thread>

void worker(int& num) {
    ++num;
}

int main() {
    int num = 100;
    std::thread th(worker, std::ref(num));
    th.join();

    std::cout << num << std::endl;

    return 0;
}

実行結果は以下。

101


たぶん続く…