std::thread::thread

提供: C++入門
移動: 案内検索
スポンサーリンク

std::thread::thread とは、std::threadのコンストラクタです。スレッドオブジェクトを作成します。

読み方

std::thread::thread
えすてぃーでぃー すれっど すれっど

概要

std::thread::thread とは、std::threadのコンストラクタです。スレッドオブジェクトを作成します。

ヘッダファイル

#include <thread>
// C++11
thread();
thread( thread&& other );
template< class Function, class... Args > 
explicit thread( Function&& f, Args&&... args );
thread(const thread&) = delete;

シンプルなスレッドの例

ソースコード std_thread1.cpp

#include <iostream>
#include <thread>
#include <exception>
using namespace std;
void
do_worker1 () {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
}
 
int
main (int argc, char *argv[]) {
        try {
                std::thread t1(do_worker1);
                t1.join();
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return (0);
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  -pthread std_thread1.cpp -o std_thread1

実行例

% ./std_thread1
void do_worker1()

2つのスレッドを動かす例

ソースコード std_thread2.cpp

#include <iostream>
#include <thread>
#include <exception>
using namespace std;
void
do_worker1 () {
        for (int i = 0; i < 5; i++) {
                std::cout << __PRETTY_FUNCTION__ << std::endl;
                std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
}
void
do_worker2 () {
        for (int i = 0; i < 5; i++) {
                std::cout << __PRETTY_FUNCTION__ << std::endl;
                std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
}
 
int
main (int argc, char *argv[]) {
        try {
                std::thread t1(do_worker1);
                std::thread t2(do_worker2);
                t1.join();
                t2.join();
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return (0);
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  -pthread std_thread2.cpp -o std_thread2

実行例

% ./std_thread2
void do_worker1()
void do_worker2()
void do_worker2()
void do_worker1()
void do_worker2()
void do_worker1()
void do_worker1()
void do_worker2()
void do_worker1()
void do_worker2()

スレッドに引数を渡す例

ソースコード std_thread_arg2.cpp

#include <iostream>
#include <thread>
#include <exception>
using namespace std;
void
do_worker1 (int a, int b) {
        std::cout << __PRETTY_FUNCTION__ << " " << a << " " << b << std::endl;
}
 
int
main (int argc, char *argv[]) {
        try {
                std::thread t1(do_worker1, 1,2);
                t1.join();
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return (0);
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  -pthread std_thread_arg2.cpp -o std_thread_arg2

実行例

% ./std_thread_arg2
void do_worker1(int, int) 1 2

参照をスレッドに渡す例

ソースコード std_thread_ref1.cpp

スレッドに参照を渡す場合は、std::ref()を使用して、引数を渡します。

#include <iostream>
#include <thread>
#include <exception>
using namespace std;
void
do_worker1 (int& a) {
        std::cout << __PRETTY_FUNCTION__ << " " << a++ << std::endl;
}
 
int
main (int argc, char *argv[]) {
        int a = 1000;
        try {
                std::thread t1(do_worker1, std::ref(a) );
                t1.join();
                cout << __PRETTY_FUNCTION__ << " " << a << endl;
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return (0);
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  -pthread std_thread_ref1.cpp -o std_thread_ref1

実行例

% ./std_thread_ref1
void do_worker1(int&) 1000
int main(int, char**) 1001

クラスのオブジェクトをスレッドに渡す例

std::thread::threadにクラスのオブジェクトを渡すことができます。実行する関数は operator()として実装します。 std::thread::threadに引数としてオブジェクトをそのまま渡すとオブジェクトがコピーされます。コピーではなく、参照を渡したい場合には、std::refを渡します。参照を渡す場合は、スレッドが完了する前にオブジェクトが破棄しないように注意が必要です。

ソースコード std_thread_class1.cpp

#include <iostream>
#include <thread>
#include <exception>
using namespace std;
class do_work {
        int     x;
        public:
                do_work(): x(0) {}
                void operator()() {
                        std::cout << __PRETTY_FUNCTION__ << std::endl;
                        x++;
                }
                int get_data() {
                        return (x);
                }
};
 
int
main (int argc, char *argv[]) {
        try {
                do_work do_worker1;
                std::thread t1(do_worker1); // コピーを渡す
                t1.join();
                cout << do_worker1.get_data() << endl;
                std::thread t2(std::ref(do_worker1)); // 参照を渡す
                t2.join();
                cout << do_worker1.get_data() << endl;
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return (0);
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  -pthread std_thread_class1.cpp -o std_thread_class1

実行例

% ./std_thread_class1
void do_work::operator()()
0
void do_work::operator()()
1

関連項目

std::thread メンバ関数
関数 説明
メンバ関数
std::thread::thread コンストラクタ。threadオブジェクトを作成します。
std::thread::~thread スレッドがjoinかdetachされている必要があります。スレッドオブジェクトを破棄します。
std::thread::operator= スレッドオブジェクトをmoveします。
オブザーバー
std::thread::joinable スレッドが合流可能であるかチェックします。
std::thread::get_id スレッドのIDを返します。
std::thread::native_handle スレッドハンドルを返します。
std::thread::hardware_concurrency 実装によってサポートされる同時スレッド数を返します。
操作
std::thread::join スレッドの終了を待ちます。
std::thread::detach スレッドハンドルから独立して実行するスレッドを許可します。
std::thread::swap スワップ
非メンバ関数
std::swap スワップ
カレントスレッドの管理
std::this_thread::yield_id 処理系に再スケジュールの機会を与えます。
std::this_thread::get_id スレッドIDを返します。
std::this_thread::sleep_for 指定した時間、現在のスレッドの実行を停止します。
std::this_thread::sleep_until 指定した時刻まで、現在のスレッドの実行を停止します。




スポンサーリンク