terminate called without an active exception错误分析

本文探讨了在C++中如何创建子线程并确保主线程不阻塞直到子线程完成,介绍了join()和detach()函数的使用,以及它们在防止‘terminate called without an active exception’错误中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

在使用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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值