「std::thread::thread」の版間の差分
提供: C++入門
(ページの作成:「std::thread::thread とは、std::threadのコンストラクタです。スレッドオブジェクトを作成します。 '''読み方''' ;[[std::thread::th...」) |
|||
行181: | 行181: | ||
int main(int, char**) 1001 | int main(int, char**) 1001 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | == std_thread_class1.cpp の例 == | ||
+ | [[std::thread::thread]]にクラスのオブジェクトを渡すことができます。実行する関数は operator()として実装します。 | ||
+ | [[std::thread::thread]]に引数としてオブジェクトをそのまま渡すとオブジェクトがコピーされます。コピーではなく、参照を渡したい場合には、[[std::ref]]を渡します。参照を渡す場合は、スレッドが完了する前にオブジェクトが破棄しないように注意が必要です。 | ||
+ | === ソースコード std_thread_class1.cpp === | ||
+ | <syntaxhighlight lang="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); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | === コンパイル === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | === 実行例 === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./std_thread_class1 | ||
+ | void do_work::operator()() | ||
+ | 0 | ||
+ | void do_work::operator()() | ||
+ | 1 | ||
+ | </syntaxhighlight> | ||
+ | |||
== 関連項目 == | == 関連項目 == | ||
* [[C++11]] | * [[C++11]] | ||
{{thread}} | {{thread}} | ||
<!-- vim: filetype=mediawiki --> | <!-- vim: filetype=mediawiki --> |
2013年12月29日 (日) 16:19時点における版
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_class1.cpp の例
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::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 | 指定した時刻まで、現在のスレッドの実行を停止します。 |