多线程环境下,主线程先退出,子线程会被强制退出吗?

1、进程中线程之间的关系

线程不像进程,一个进程中的线程之间是没有父子之分的,都是平级关系。即线程都是一样的, 退出了一个不会影响另外一个。

但是所谓的"主线程"main,其入口代码是类似这样的方式调用main的:exit(main(…))。

main执行完之后, 会调用exit()。

exit() 会让整个进程over终止,那所有线程自然都会退出。

2、主线程先退出,子线程继续运行的方法

在进程主函数(main())中调用pthread_exit(),只会使主函数所在的线程(可以说是进程的主线程)退出;而如果是return,编译器将使其调用进程退出的代码(如_exit()),从而导致进程及其所有线程结束运行。

理论上说,pthread_exit()和线程宿体函数退出的功能是相同的,函数结束时会在内部自动调用pthread_exit()来清理线程相关的资源。但实际上二者由于编译器的处理有很大的不同。

按照POSIX标准定义,当主线程在子线程终止之前调用pthread_exit()时,子线程是不会退出的。

When you program with POSIX Threads API, there is one thing about pthread_exit() that you may ignore for mistake. In subroutines that complete normally, there is nothing special you have to do unless you want to pass a return code back using pthread_exit(). The completion won’t affect the other threads which were created by the main thread of this subroutine. However, in main(), when the code has been executed to the end, there could leave a choice for you. If you want to kill all the threads that main() created before, you can dispense with calling any functions. But if you want to keep the process and all the other threads except for the main thread alive after the exit of main(), then you can callpthread_exit() to realize it. And any files opened inside the main thread will remain open after its termination.

main()中调用了pthread_exit后,导致住线程提前退出,其后的exit()无法执行了,所以要到其他线程全部执行完了,整个进程才会退出。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当程序运行到main函数时,main函数是程序的入口函数,也就是程序的起点。一般情况下,main函数执行完毕后,程序退出。但是有一种特殊情况,即在main函数中调用其他函数或线程,这些函数或线程没有执行完毕,导致main函数无法退出,从而整个程序也无法退出。 这种情况下,可能是因为其他函数或线程在运行时出现了错误或陷入了无限循环导致无法退出。比如,在调用其他函数时,如果该函数中存在死循环或者递归调用,就导致程序无法正常退出。 另外,可能是在多线程的情况下,线程在main函数中启动了其他线程,且这些线程没有执行完毕或被阻塞住,就导致线程无法退出。这种情况下,线程可以通过等待所有线程执行完毕或者显式地终止线程来保证程序的正常退出。 解决这种问题的方法要有两种。一种是通过调试工具来定位问题,找到程序中出现无法退出的原因,修复相关代码。另一种是使用操作系统提供的强制退出的方式,如在Windows中使用Ctrl+C或通过任务管理器结束进程来强制关闭程序。 总之,当程序的main函数无法退出时,往往是其他函数或线程出现了问题,导致程序无法正常结束。寻找问题原因并修复代码,或者通过操作系统提供的强制退出方式来解决问题,才能使程序正常退出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值