前同事咨询有关线程的问题,遇到与terminate called without an active exception错误分析-CSDN博客一样的报错,然而代码有点庞大,很难去定位问题,于是,我简化模拟一下,简化成如下
#include <iostream>
#include <thread>
#include <mutex>
void waypoint(int i)
{
std::cout<<"waypoint!"<<std::endl;
if (i == 6) throw "throw error";
}
int main()
{
int i = 0;
try
{
while (i < 10)
{
std::thread mythread1([&i]()
{
std::cout << "子线程:" << i << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
i++;
});
std::cout << "main()"<< std::endl;
waypoint(i); // 1
mythread1.join(); //* *// 2
std::cout << "main thread executed finish!" << std::endl; //3
}
}
catch(const char* msg) //i==6时 /* */waipoint会抛出异常
{
std::cout << msg << std::endl;
return 0;
}
system("pause");
return 0;
}
也就是,waypoint()当中抛出的异常,强制退出了while循环,导致仍在执行的子线程销毁掉了,引起的报错
解决方法:
mythread1.join() 和 waypoint()调个位置就可以了;
子线程创建后立马join()和detach()