大家来讨论一下,关于子线程和主线程的终止运行的先后顺序!

SuperKick 2006-06-15 02:53:03
说明:子线程是在主线程中创建的,并由主线程控制是否终止运行。
现在要讨论的问题是:主线程是否一定要等所有子线程都终止了自己才能终止运行?
...全文
1105 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
SuperKick 2006-06-19
  • 打赏
  • 举报
回复
其实就是加了这一句
WaitForSingleObject( hThreadExitEvt, 2000 );
SuperKick 2006-06-19
  • 打赏
  • 举报
回复
听取了大家的建议后,我把程序改了一下,现在是这样做的:
(1)子线程里主要是运算,没有类似Socket中Read之类的阻塞动作。
(2)为了保证等子线程都退出了主程序再退出,我加了个叫hThreadExitEvt的Event句柄来控制。
目前这样好像没有出什么问题。
covsno 2006-06-19
  • 打赏
  • 举报
回复
如果子线程是关闭主线程用的 会出现什么情况?
zjz800800 2006-06-19
  • 打赏
  • 举报
回复
假如在子线程里面没有阻塞的话肯定用WaitForSingleObject,100%能安全退出程序也不会造成泄漏这是肯定的,但现在讨论的是带阻塞的(比如accept),这样肯定泄漏,你测试的是没有阻塞的,测清楚在总结,:)
zdjnju 2006-06-18
  • 打赏
  • 举报
回复
在Windows看来,子线程和主线程根本没任何区别,当一个进程中所有线程已死时,Windows就认为进程已死!
如果主线程正常退出的话(main函数正常返回),确实会导致所有的子线程结束,但这只是因为主线程在内部调用了ExitProcess函数——这也就是说,如果主线程是由于其他原因被KILL掉的话(比如TerminateThread),子线程并不会退出,进程照样运行~
krfstudio 2006-06-17
  • 打赏
  • 举报
回复
一般无所谓啦,看你的具体需求是怎么样的,只要同步控制得好就没有问题。
zjz800800 2006-06-17
  • 打赏
  • 举报
回复
主线程里面关闭掉带有阻塞语句的子线程(因为在子线程的阻塞语句后面有释放某些申请的资源,所以主线程退出的时候,如果子线程不能正常退出就会出现泄露)
蒋晟 2006-06-17
  • 打赏
  • 举报
回复
No, again, use a timeout when waiting and use a message pump to prevent deadlock.
fireseed 2006-06-17
  • 打赏
  • 举报
回复
CloseHandle并不能结束线程,只是关掉线程的句柄,每一个打开的线程句柄在用完后都要关闭的,不然会内存泄露。
wfhlxl 2006-06-17
  • 打赏
  • 举报
回复
如果某个子线程正在使用打印机,主线程没把它关闭,自己退出了,那么子线程在打印完之前,其它程序无法使用,用了这么多年的windows,还没实践过这种情况.
zjz800800 2006-06-17
  • 打赏
  • 举报
回复
to krfstudio()
好的,这样吧,你解决一下(主线程里面关闭掉带有阻塞语句的子线程,因为阻塞语句后有释放在阻塞之前申请的资源),你给同步控制一下,看怎么个就没问题,我想因该有解决的方法就是你说的"只要同步控制得好就没有问题",关键是怎么个同步控制得好???
yayafu 2006-06-16
  • 打赏
  • 举报
回复
退出系统不会报错,CloseHandle也干不掉子线程。想清楚了再说
SuperKick 2006-06-16
  • 打赏
  • 举报
回复
再顶
smzbase 2006-06-16
  • 打赏
  • 举报
回复
退出时系统会报错舍,至于泄漏。。。个人表示怀疑
CloseHandle可以强制干掉子线程,后果是可能会出现泄漏
anothervip 2006-06-16
  • 打赏
  • 举报
回复
会吗?
zjz800800 2006-06-16
  • 打赏
  • 举报
回复
这种情况就是,如果有资源没来的急释放就会出现泄露
zjz800800 2006-06-16
  • 打赏
  • 举报
回复
上面还有人说会吗? 200%会,我现在这个问题(主线程里面关闭掉带有阻塞语句的子线程)
就是因为关不掉就造成了泄露,麻烦讨论的朋友看清楚上面的帖子了再回答,别光顾着说两句就抢分,鄙视中...

还有用Event来判断关闭带有阻塞语句的子线程行不通,会造成死锁。
萧山夜雨 2006-06-16
  • 打赏
  • 举报
回复
进程结否时,线程被强制结束。集成环境会报资源泄露。但对操作系统来说,进程结束,资源总可以全部释放。
gdsdyl 2006-06-16
  • 打赏
  • 举报
回复
正常情况下应该先退出子线程,再关闭主线程.
通常是采用Event\变量等方式让子线程自动退出.若直接关闭主线程,有可能会出现内存泄漏或系统报错,但要区分子线程使用了什么资源的情况下.
SuperKick 2006-06-15
  • 打赏
  • 举报
回复
再问一句,如果子线程没有退出主线程就退出了会出现什么情况呢?看见这么多高手进来忍不住要多问一句,嘿嘿。。。
加载更多回复(7)

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧