启动一个线程 话不多说,直接上代码 void func();int main(){ std::thread t(func); //这里就开始启动线程了 return 0;}void func(){ std::cout "Hello, " std::this_thread::get_id() std::endl;} 等待子线程结束 有时候开
启动一个线程
话不多说,直接上代码
void func(); int main() { std::thread t(func); //这里就开始启动线程了 return 0; } void func() { std::cout << "Hello, " << std::this_thread::get_id() << std::endl; }
等待子线程结束
有时候开启一个子线程之后,父线程很快运行结束;
如果想要父线程做完自己的工作之后等待子线程运行完再结束
...... std::thread t(func); t.join(); ......
子线程分离
子线程有很多很多工作需要完成,父线程不想等待它,这时候可以用detach
...... std::thread t(func); t.detach();
子线程分离后相当于是一个后台线程,这时负责子线程资源回收什么的,是c++运行库而不是父线程了.
注意点
要确保线程运行时所用的资源不会被提前释放
在上面这个小例子里,main线程创建了一个t线程,然后调用t.detach();
如果t线程中使用到了main线程里的某些资源(记作resources),那么就有必要引起注意.
如果main线程工作很少;t线程工作繁重,需要运行很长时间;
当main线程结束时,resources会被释放,然而这时t线程中还需要用到这些resources.
这就是问题所在:####要确保线程运行时所用的资源不会被提前释放
detach和join两者只能用一次
不能调用了detach之后再调用join;也不能调用join之后再调用detach (测试的时候我就试了先用detach再用join,然后就死了,卡了好一会。。)