我现在写一个程序,有两个线程:界面线程和工作线程。工作线程用于在后台计算数据,不断地把计算得到的数据打成包以消息的形式发给界面窗口,界面窗口的消息处理函数里显示结果。
为了不让界面线程因为后台线程CPU占用率过高而死掉,我把后台工作线程的优先级设成最低。本来这样可以工作地得好的,界面操作也很流畅。
但到了超线程的P4机器上运行时,还是发现界面死掉了,就像根本没开后台线程一样。
我想了很久,觉得问题可能出在线程调度上。对操作系统来说,HT技术的CPU就是一台双CPU的机器,所以它可以安排这两个线程在“两个不同的”CPU上运行,以便提高效率。但是,实际上还是只有一颗CPU,当系统发现后台线程在一颗只有“一个线程”的CPU上运行时,自然不会去打断它,不管它的优先级有多低,我想这可能就是问题所在,整个CPU还是被后台线程给占掉了。 不知道大家怎么看,或是有什么办法吗?当然,我知道可以强制两个线程在同一个CPU上运行,但这样会影响程序在真正双CPU机器上的运行效果。
为了不让界面线程因为后台线程CPU占用率过高而死掉,我把后台工作线程的优先级设成最低。本来这样可以工作地得好的,界面操作也很流畅。
但到了超线程的P4机器上运行时,还是发现界面死掉了,就像根本没开后台线程一样。
我想了很久,觉得问题可能出在线程调度上。对操作系统来说,HT技术的CPU就是一台双CPU的机器,所以它可以安排这两个线程在“两个不同的”CPU上运行,以便提高效率。但是,实际上还是只有一颗CPU,当系统发现后台线程在一颗只有“一个线程”的CPU上运行时,自然不会去打断它,不管它的优先级有多低,我想这可能就是问题所在,整个CPU还是被后台线程给占掉了。 不知道大家怎么看,或是有什么办法吗?当然,我知道可以强制两个线程在同一个CPU上运行,但这样会影响程序在真正双CPU机器上的运行效果。
解决方案 »
- 求详细解读下面的代码.
- MFC中关于坐标系统,映射方式,视口,窗口的问题
- GPRS在智能监控中的运用
- 打算用从列表控件CListCtrl继承出一个类,是大图标模式的,能不能实现自绘?
- &是什么意思?
- 我做的控件插入到网页里,怎么才能让没有这个控件的人可以下载使用啊?
- 怎么CSDN的论坛才能显示四页啊???
- 如何使用一个子程序生成一个view?就像菜单new的功能一样??急
- 如何在Outlook Express或word中的工具栏上加入自己的按钮
- 怎样用SDK的方法改变文本框的字体?(内空)
- 求救,有没有人看过这本书<<Visual C++网络编程实作教程>>
- 从事过Socket传输位图的同志请进来一下~~
个人意见而已.
该Sleep的地方就要Sleep.
为什么我的实现方式不妥?不妥在哪里?给个意见好吗? 关掉超线程当然一切正常了。
busy loop是万不得一走投无路的选择,在多线程设计里面还是应该注意要某些线程合理释放自己的CPU时间,如果Sleep(1)你都觉得长了,也至少应该Sleep(0)一下.
从方案上来说,处理好后台线程的计算量(减少无用计算),控制好刷新前台屏幕的数据刷新率(刷新率太高没有意义)...从结构上做一些优化应该也是很有意义的.
而且这里用发消息的方法来通知界面未必妥当,可能造成消息阻塞,界面用(多媒体)定时器来检测数据的变化或者使用信号量效率会好很多
子线程与界面线程的通讯应该是双向的,子线程可以向界面线程发送数据,
界面线程线程也可向子线程发送命令,比如中断子线程运行等,
运行WaitForSingleObject这样的同步命令会大大降低CPU的占用率,
我的后台线程是一个科学计算的迭代过程,当然算得越快越好,我只是想能在保持界面更新的情况下充分利用CPU的计算资源。