您的当前位置:首页正文

C++ 主进程等待子线程的问题以及解决

2024-11-10 来源:个人技术集锦

0X00 C++11 的 < thread > 库

今天在做实验的时候需要用到多线程,于是去搜了一些过于C++多线程编程的知识。
了解到,在C++11中,添加了新库来支持多线程:

#include <thread>

创建新线程的方法如下:

std::thread t(function)

其中 function()是定义好的函数,function()是函数名

当线程创建好之后有两种方式启动,一种是.join(),一种是.detach()

0X10 .detach() 函数的坑

上面说道的两种启动方式,.join()是将线程启动,并且阻塞,也就是说,如果子线程不结束的话,主线程或者主进程就不会继续;
.detach()便是开辟一条独立的线程,会与主线程分离,自己干自己的,不会影响主线程。

这样听起来很好啊,但是但是,坑就在这。
假如你是这样创建的,你别以为就高枕无忧了

void function()
{
//...
}
int main()
{
//...
std::thread t(function);
t.detach();

return 0;
}

这时候问题就来了,你以为主程序会等你?

然而并不会,你会发现,你的线程还没运行多久(假设是运行时间很长的线程),主程序就退出了。

也就是说主程序其实并没用等待。原因是编译器会将 return 优化为 exit 也就是将进程强制退出了,当然进程没了,线程也自然没了。

0X20 解决——pthread_exit(NULL)

那我们如何才能让主线程等待呢?

很简单,用下面的函数:

pthread_exit(NULL); 

意思就是等待所有线程结束后,再结束主进程

void function()
{
//...
}
int main()
{
//...
std::thread t(function);
t.detach();

pthread_exit(NULL); 
return 0;
}

问题就这样简单的解决啦

虽然是很简单,但是一旦犯错,有时候却很难察觉。所以如果你想要让主线程等待子线程(一般都会如此吧),那就请加上——pthread_exit(NULL) 吧!

好啦,今天就说这点啦,下次再见~

显示全文