スレッドでHello World!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <thread> using namespace std; // スレッドで実行される void threadfunc() { cout << "Hello World!" << endl; } int main() { // スレッドを作成して実行 thread th(threadfunc); // スレッド終了を待機 th.join(); } |
スレッドに値を渡す(int)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <thread> using namespace std; // スレッドで実行される void threadfunc(int i) { cout << i << endl; } int main() { // スレッドを作成して実行 thread th(threadfunc, 123); // スレッド終了を待機 th.join(); } |
スレッドに値を渡す(class)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> #include <thread> using namespace std; class C { public: C() { cout << "C()" << endl; } C(const C& c) { cout << "C(const C&)" << endl; } C(C&& c) { cout << "C(const C&&)" << endl; } ~C() { cout << "~C()" << endl; } }; // スレッドで実行される void threadfunc(C c) { cout << __FUNCTION__ << endl; } int main() { // スレッドを作成して実行 thread th(threadfunc, C()); // スレッド終了を待機 th.join(); } |
実行結果
1 2 3 4 5 6 7 8 |
C() C(const C&&) ~C()C(const C&&) threadfunc ~C() ~C() Press <RETURN> to close this window... |
スレッドで実行しているので改行が合わない。がコンストラクタは以下のように呼ばれている。ユニバーサル参照のコンストラクタしか呼ばれていない。
std::threadは基本的な機能しか提供していないようで高度なことはできないようだ。例えばスレッドを開始しなかったり、スタック領域をしていしたり、スレッドをKILLしたり、ただnativehandleで処理系依存のスレッドハンドルが取得できるのでKILLくらいならできる。スレッド関数の戻り値には意味がない。スレッドから値を取得したい場合は引数経由で行う。
KILLしてみたコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include <iostream> #include <thread> #include <Windows.h> using namespace std; class C { public: C() { cout << "C()" << endl; } C(const C& c) { cout << "C(const C&)" << endl; } C(C&& c) { cout << "C(const C&&)" << endl; } ~C() { cout << "~C()" << endl; } }; // スレッドで実行される void threadfunc(C c) { // 無限ループ for(int i=0; ;++i) cout << __FUNCTION__ << i <<endl; } int main() { // スレッドを作成して実行 thread th(threadfunc, C()); // 2秒スリープ std::this_thread::sleep_for(2s); // スレッドを強制終了 if(TerminateThread(th.native_handle(), -1)) { // なぜかこれが動かない cout << "Thread Killed" << endl; } else { cerr << "Failed to kill thread" << endl; exit(1); } // スレッド終了を待機、本来すぐ処理が戻るはずだがなんかおかしい th.join(); } |
上のコードはうまく動かなくなる。coutがおかしくなってしまうのだと思われる。
というわけであんまり使えなそうである。スレッド関数はあくまでも計算とかを実行し、入出力に使うのは基本的に良くない。