windows平台主线程退出后对子线程的影响

1.进程与主线程:
首先得明确一点,我理解的进程是一个exe文件运行之后的独立资源,每个进程有且仅有一个主线程,进程是负责分配资源的,线程是负责执行资源的(一般可以认为线程的执行时间就是线程调度函数的运行时间),相当于进程是包工头,线程是干活的工人,在后文里,不做特殊说明,子线程统一都是由主线程直接或间接创建的。

2.主线程结束后,其它子线程是立刻退出还是继续执行?
答案:主线程退出可能会间接导致子线程退出!但不会直接导致子线程退出!
因为主线程退出分两种情况:
(1) 不对主线程做任何特殊处理,当其正常结束后,主进程也会结束,从而间接导致其它子线程的执行资源被回收,子线程也全部结束运行。

我自己做了一个测试来验证这个结果,创建线程的属性也基本是项目里常用的,代码如下,主函数就是主线程的执行资源,地球人都知道,就不啰嗦了:
在这里插入图片描述

对于这个代码,主线程肯定是比子线程先退出的,它执行10秒,其它的子线程执行40秒,配合任务管理器来观察,如果”主线程”文字打印完之后,控制台直接关闭而不是继续等待,并且任务管理器里的进程也结束了,那就说明之前的推论是正确的,下面是运行之后的情况;

程序刚运行时,控制台和任务管理器如下:
在这里插入图片描述

10秒过后,控制台消失,任务管理器里也没有”ClassTest”进程了:
在这里插入图片描述
这种情况下,主线程正常退出后,其它子线程也不能执行了!

(2) 调用API去关闭主线程时,主进程不会退出,其它子线程会正常执行。
在这里插入图片描述
对于上面的代码,运行时的截图跟之前一样,但是主线程是被API结束的,不是正常退出,10秒过后,控制台没有退出,任务管理器里”ClassTest”进程还在,线程数量减少,说明三个子线程还在:
在这里插入图片描述
3. 子线程退出是否会互相影响?
答案是不会,有一点得明确,假如线程A创建了线程B,它俩就是单独的两个线程了,A的退出不会影响B,B的退出也不会影响A。可以理解为工地的工人工作量太大,他可以另外拉一个工人(线程)来帮自己干活,工资还是由包工头(主进程)来负责;就像我们组老大(子线程A)只负责拉我(子线程B)来干活,但是工资是老板 (主进程)来发。

综上所述:
(1) 主线程的退出对其它线程并没有直接影响;主线程被提前强制结束时,不会导致进程退出,其他子线程会正常执行;主线程正常结束时,会导致进程退出,从而回收进程资源,其他子线程也都退出(这种现象看起来像是主线程直接导致子线程结束,不能弄混了)。
(2) 子线程退出不会对别的线程直接造成影响,因为主进程还在,只不过可能因为数据共享等问题给别的线程造成一些麻烦。

By the way:
很多人用VS测试的时候,会在主函数末尾加上system(“pause”)或getchar()不让控制台结束,我想了想,做这个测试的时候不能用这两个方法,因为它们会导致主线程阻塞,那这样一来主线程不退出,这个测试就没法做了……我刚开始就是犯了这个错误….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值