今天在做实验的时候需要用到多线程,于是去搜了一些过于C++多线程编程的知识。
了解到,在C++11中,添加了新库来支持多线程:
#include <thread>
创建新线程的方法如下:
std::thread t(function)
其中 function()
是定义好的函数,function()
是函数名
当线程创建好之后有两种方式启动,一种是.join()
,一种是.detach()
上面说道的两种启动方式,.join()
是将线程启动,并且阻塞,也就是说,如果子线程不结束的话,主线程或者主进程就不会继续;
而 .detach()
便是开辟一条独立的线程,会与主线程分离,自己干自己的,不会影响主线程。
这样听起来很好啊,但是但是,坑就在这。
假如你是这样创建的,你别以为就高枕无忧了
void function()
{
//...
}
int main()
{
//...
std::thread t(function);
t.detach();
return 0;
}
这时候问题就来了,你以为主程序会等你?
然而并不会,你会发现,你的线程还没运行多久(假设是运行时间很长的线程),主程序就退出了。
也就是说主程序其实并没用等待。原因是编译器会将 return
优化为 exit
也就是将进程强制退出了,当然进程没了,线程也自然没了。
那我们如何才能让主线程等待呢?
很简单,用下面的函数:
pthread_exit(NULL);
意思就是等待所有线程结束后,再结束主进程
void function()
{
//...
}
int main()
{
//...
std::thread t(function);
t.detach();
pthread_exit(NULL);
return 0;
}
问题就这样简单的解决啦
虽然是很简单,但是一旦犯错,有时候却很难察觉。所以如果你想要让主线程等待子线程(一般都会如此吧),那就请加上——pthread_exit(NULL)
吧!
好啦,今天就说这点啦,下次再见~