|
本帖最后由 吟笑一声 于 2017-11-2 21:49 编辑
- 模块版本:v5.8
- 所用系统:(如:XP、Win7 32位)
- 命令名称:类_线程池
- BUG描述:1,线程池启动过程,程序高几率退出 2,线程池启动后CPU暴涨
- 我的联系QQ:577379385|吟笑一声
- -------如果可以,请把测试有问题的【源码】上传上来,方便我们测试。如果你有解决方案请一并提出,感谢!
以前一直用精易模块线程池:类_线程池 精易模块版本:5.8
然后,我更新了一下新版的精易模块,编写新的东西,结果出现了一些问题。
1,CPU容易暴涨
2,启动线程池过程,程序很大几率退出。
研究分析了下代码,找出了一些原因,以下是我的修复过程:
主要问题出现在这个子程序:内部_线程()
1,如果真 (GetQueuedCompletionStatus (IOCP句柄, lpNumberOfBytesTransferred, 处理状态, 0, -1) = 1)
改为:如果 (GetQueuedCompletionStatus (IOCP句柄, lpNumberOfBytesTransferred, 处理状态, 0, -1) = 1),成立,则执行主代码。
在条件是假的时候,sleep(10),这样CPU就直接降到0%,而不是之前的百分之九十几。原因有兴趣的自己去查.
2,坑爹,居然在 内部_线程(),调用HeapFree,把“数据传递指针”,这个内存地址,给释放了,突然想骂人,算了忍住。
这样会导致什么后果呢,比如你启动10条线程池,只有一条是成功得到IOCP句柄,然后你释放了,释放了之前申请的 “临时_线程内存状态地址”
其他剩余的线程得到的,是无效地址,取出IOCP的句柄=0.。。。。。。无语了。
解决方案:把 HeapFree (GetProcessHeap (), 0, 数据传递指针),这行代码,从 内部_线程() 去掉,放到 类_线程池 的 启动() 的倒数第二行,即可。
也就是 返回(真) 的上面...
无法想象,我启动的N条线程,只有1条是正确得到IOCP句柄的,其他剩下的线程 都是持着0句柄在空转。
导致我测试软件的时候,结果出现偏差。
发现,循环启动线程完毕之后,过早调用HEAPFREE,也导致传递空的ICOP句柄,估计是释放的太快了,内部_线程() 那边没反应过来,启动这里就像图这样改,
那个 内部_线程() 的如果真 就不用改为如果了,CPU暴涨的原因就是 持了IOCP句柄= 0 在空转,导致的。
|
评分
-
查看全部评分
|