C++: 一个core dump

[复制链接]
 楼主| keer_zu 发表于 2023-2-24 09:57 | 显示全部楼层 |阅读模式
  1. terminate called without an active exception
  2. Abort (core dumped)
 楼主| keer_zu 发表于 2023-2-24 10:10 | 显示全部楼层



例如:
  1. void task1(std::string msg){
  2.         std::cout << "task1 says: " << msg;
  3. }
  4. int main() {
  5.         std::thread t1(task1, "hello");
  6.         return 0;
  7. }



原因分析及解决方案:
原因就是创建线程后,主线程立马退出。但是子线程还没执行完,子线程被销毁,此时就会出现上述错误。知道了造成错误的原因,那么解决错误的方法自然而然也就可以得出。
 楼主| keer_zu 发表于 2023-2-24 10:10 | 显示全部楼层
解决方法一:主线程等待子线程完成后退出
C++中提供了join()函数,join()函数就是一个等待线程完成的函数,主线程需要等待子线程运行结束,才可以结束,也就是调用join()方法的线程是子线程。将上述代码改成如下,即不会抛出异常:

  1. void task1(std::string msg){
  2.         std::cout << "task1 says: " << msg;
  3. }
  4. int main() {
  5.         std::thread t1(task1, "hello");
  6.         t1.join();
  7.         return 0;
  8. }
 楼主| keer_zu 发表于 2023-2-24 10:11 | 显示全部楼层
解决方法二:主线程退出并不干预子线程的销毁
C++种提供了detach()函数,detach函数就是让子线程与主线程分离,主线程不再干预子线程的运行,缺点就是主线程无法获取子线程的执行结果,因为主线程此时已经退出。下面的代码可以正常运行,但是不会打印"task1 says hello"。

  1. void task1(std::string msg){
  2.         std::cout << "task1 says: " << msg;
  3. }
  4. int main() {
  5.         std::thread t1(task1, "hello");
  6.         t1.detach();
  7.         return 0;
  8. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1478

主题

12912

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部

1478

主题

12912

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部