项目场景:
在使用C++中thread类创建子线程完成相关功能,并且主线程不阻塞直到子线程完成。
问题描述:
子线程的初始化在对象的初始化过程中,并且子线程有自己独立的功能,主线程并不阻塞直到子线程完成对应的功能。
类似代码示例如下:
void task1(std::string msg){
std::cout << "task1 says: " << msg;
}
int main() {
std::thread t1(task1, "hello");
return 0;
}
编译后执行会报如下错误:
terminate called without an active exception
Aborted
原因分析及解决方案:
原因就是创建线程后,主线程立马退出。但是子线程还没执行完,子线程被销毁,此时就会出现上述错误。知道了造成错误的原因,那么解决错误的方法自然而然也就可以得出。
解决方法一:主线程等待子线程完成后退出
C++中提供了join()函数,join()函数就是一个等待线程完成的函数,主线程需要等待子线程运行结束,才可以结束,也就是调用join()方法的线程是子线程。将上述代码改成如下,即不会抛出异常:
void task1(std::string msg){
std::cout << "task1 says: " << msg;
}
int main() {
std::thread t1(task1, "hello");
t1.join();
return 0;
}
解决方法二:主线程退出并不干预子线程的销毁
C++种提供了detach()函数,detach函数就是让子线程与主线程分离,主线程不再干预子线程的运行,缺点就是主线程无法获取子线程的执行结果,因为主线程此时已经退出。下面的代码可以正常运行,但是不会打印"task1 says hello"。
void task1(std::string msg){
std::cout << "task1 says: " << msg;
}
int main() {
std::thread t1(task1, "hello");
t1.detach();
return 0;
}
如有错误,希望大家批评指正,日拱一卒,功不唐捐。
参考:https://stackoverflow.com/questions/7381757/c-terminate-called-without-an-active-exception
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-01-30 双网卡单IP实现网卡冗余与负载均衡
2018-01-30 live555源码分析----RSTPServer创建过程分析