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 就可以了
但是,这个问题更底层的原因就不清了,望知道的大神赐教,这种问题怎么规避?也有可能是我方向走错了,望大神指正。
做了一下几个实验来验证:
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 就可以了
但是,这个问题更底层的原因就不清了,望知道的大神赐教,这种问题怎么规避?也有可能是我方向走错了,望大神指正。
相关文章推荐
- MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出
- mfc 创建线程函数AfxBeginThread,线程中访问mfc控件
- 用哪个函数创建线程(AfxBeginThread)
- mfc下AfxBeginThread创建线程
- CreateThread()线程创建函数,AfxBeginThread等
- MFC中 如何在类对象内部创建线程(AfxBeginThread())
- 猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止
- CreateThread()线程创建函数,AfxBeginThread等
- MFC用户线程AfxBeginThread()
- MFC下暂停、继续、结束AfxBeginThread开启的线程
- AfxBeginThread函数创建进程
- MFC全局函数::AfxBeginThread
- 创建一个线程用哪个好?--CreateThread._beginthread.AfxBeginThread比较
- AfxBeginThread创建线程的用法
- 创建线程的方法【CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别】
- 在windows上,AfxBeginThread 和 CreateThread 创建的线程是有一点区别的
- AfxBeginThread函数创建进程
- MFC下结束AfxBeginThread开启的线程的一些体会
- MFC全局函数::AfxBeginThread 函数
- MFC全局函数::AfxBeginThread