您的位置:首页 > 其它

MFC 用afxbeginthread创建线程 线程函数直接 return 0 返回。任务管理器显示线程数与理论值不符

2016-10-26 22:12 302 查看
一个MFC做的服务器在winsever 2003上跑了3个星期,今天突然发现CPU占用率80%+,200多个线程。但实际连接应有的线程应该只有20+,猜测长时间运行后,系统貌似并没有释放掉线程资源

做了一下几个实验来验证:

1、重启进程,启动后CPU占用率0%,说明代码逻辑并无问题,因为每个线程的代码都是一样的

2、做了一个demo在本地模拟运行

      demo流程:1、在UI线程用afxbeginthread启动一个work线程

     2、在1的work线程中循环调用afxbeginthread再启动10个work线程

     3、在2启动的10个work线程(定名为work_m)中,线程函数都直接 return 0

                             4、在2启动完10个work线程(定名为work_s)之后,进入死循环一直Sleep

       运行结果:  1、在2进入sleep之后,打开任务管理器发现该进程的线程数在变化,有时候变大,有时候变小,但都比2大(2应该是这时候的线程数)

     2、更改2中代码,每启动一个work_s线程之后等待 5s用GetExitcodeThread(hthread,&exitcode)检查线程是否已退出,返回都是 未退出

        试验过各种方法和更改代码之后,发现任务管理器显示的线程数还是和理论值对不上,于是重启PC,重启后重新运行demo(demo代码未更改),发现 任务管理器 显示的线程数正常了。

        由此推断,线程资源的释放完全由系统决定,系统可能由于某种原因未及时释放资源,导致线程数一直增加。

        代码里面只需要保证 线程函数 有return 就可以了

但是,这个问题更底层的原因就不清了,望知道的大神赐教,这种问题怎么规避?也有可能是我方向走错了,望大神指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: