メモ
- c++11からはスレッドが言語に取り込まれている.
- コンパイルには-pthreadを付ける.
- スレッドを一時的に止めるときにはsleepではなく,スレッド用のstd::this_thread::thread_for()を使う.
- thread::join()をちゃんと実行して対象のスレッドの終了を待つようにする.(またはdetachする.detachはスレッドを管理対象から外す.但し実行は裏で勝手に続く.これどんな時に使うんだろう?)
- 無限ループに入れるような場合は,外から止められるように定期的に停止フラグを見に行かせる.
- std::threadのコンストラクタに関数を渡すことでその関数を別スレッドとして実行する.関数の引数はコンストラクタの第2引数以降で渡す.
- クラス内でメンバ関数をスレッド化するときは特殊なので注意.リファレンスで渡すこと,第2引数にthisが要ることを忘れちゃダメ
#include <iostream>
#include <thread>
#include <unistd.h>
bool stop_flg = false;
void worker(int i, int j) {
while (1) {
std::cout << "I'm " << std::this_thread::get_id() << " thread." << std::endl;
std::cout << i+j << std::endl;
if (stop_flg)
break;
}
return;
}
int main(int argc, char* argv[])
{
std::thread th(worker, 1, 2);
sleep(2);
stop_flg = true;
th.join();
return 0;
}