主题:关闭主线程的问题
overfly
[专家分:3230] 发布于 2010-04-14 17:29:00
主线程关闭的瞬间,子线程可能还在运行,如果此时子线程用到了主线程的资源就会出错,这个问题如何避免?
回复列表 (共9个回复)
沙发
overfly [专家分:3230] 发布于 2010-04-14 17:51:00
在主线程里使用WaitForSingleObject等待子线程结束是不明智的,因为程序会在这里挂住
板凳
overfly [专家分:3230] 发布于 2010-04-14 17:52:00
使用TerminateThread也不好,参考下面一个原因
http://blog.csdn.net/fatacy/archive/2009/08/17/4456049.aspx
3 楼
honemay [专家分:60] 发布于 2010-04-14 18:39:00
主线程关闭之前,先在主线程里把子线程全关闭掉,,能行么?
4 楼
bruceteen [专家分:42660] 发布于 2010-04-15 00:39:00
[quote]在主线程里使用WaitForSingleObject等待子线程结束是不明智的,因为程序会在这里挂住[/quote]
“挂住”了应该去寻找死锁的原因,使用WaitForSingleObject应该是必须的吧
5 楼
bruceteen [专家分:42660] 发布于 2010-04-15 00:45:00
我也遇到过死锁的事
我在子线程中调用GetWindowText等,在主线程中WaitForSingleObject,于是死了:)
6 楼
overfly [专家分:3230] 发布于 2010-04-15 08:52:00
[quote]主线程关闭之前,先在主线程里把子线程全关闭掉,,能行么?[/quote]
我也想知道安全关闭子线程的方法呢
7 楼
overfly [专家分:3230] 发布于 2010-04-15 08:56:00
[quote]我也遇到过死锁的事
我在子线程中调用GetWindowText等,在主线程中WaitForSingleObject,于是死了:)[/quote]
我也不知道挂住的具体原因
8 楼
overfly [专家分:3230] 发布于 2010-04-15 10:01:00
知道原因了,主线程调用WaitForSingleObject等待子线程时,主线程会挂起一直等到子线程有信号或者超时,如果这时在子线程里对主线程的内容进行操作(例如GetWindowText获取主线程的窗口文本),由于主线程被挂住操作就会一直等待WaitForSingleObject返回,这样就造成了双方互相等待,死锁发生了:(
怀疑GetWindowText是通过消息循环来完成的,WaitForSingleObject导致主线程阻塞,也就导致了消息循环的阻塞。
9 楼
overfly [专家分:3230] 发布于 2010-04-16 09:57:00
大家千万不要去外包公司,每天工作12小时,周末加班,工资很低,没有奖金!
我来回复