从外部控制线程的性能问题

SpirItKay 2010-05-05 10:38:46
先举个例子
void func(void* data)//线程函数
{
float sum = 0;
while(true)
{
sum = sum + 1;
Sleep(1);
}
}

int main()
{
HANDLE hThread = (HANDLE)::_beginthread(func, NULL, NULL);

while(true)
{
Sleep(1);
}

::TerminateThread(hThread, 0);
::CloseHandle(hThread);
return 0;
}
这个例子是主线程启动了副线程后,一直让副线程跑,由于两个死循环里面都加了Sleep(1),所以这时的CPU占用为0%。
但是我希望副线程里面不出现Sleep(),副线程里面就一死循环,由主线程掌握其运行时间,修改如下。
void func(void* data)
{
float sum = 0;
while(true)
{
sum = sum + 1;
//Sleep(1);
}
}

int main()
{
HANDLE hThread = (HANDLE)::_beginthread(func, NULL, NULL);
::SuspendThread(hThread);

while(true)
{
::ResumeThread(hThread);
Sleep(1);
::SuspendThread(hThread);
Sleep(1);
}

::TerminateThread(hThread, 0);
::CloseHandle(hThread);
return 0;
}
现在的副线程里面的循环是什么都不管一直在跑,然后主线程负责暂停和恢复,但是这样出来的CPU占用是50%,请问这是为什么呢?我该如何实现线程的恢复暂停才能让CPU降到0%呢?
...全文
115 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
贪食蛇男 2010-05-05
  • 打赏
  • 举报
回复
不是说它合不合法,楼主意思只是不明白两种看起来运行结果应该没差别的程序在真正运行中但何以会造成如此大的差距,求高手来分析下,不要岔开话题了。
赵4老师 2010-05-05
  • 打赏
  • 举报
回复
一个死循环不是合法的线程!
yanran_hill 2010-05-05
  • 打赏
  • 举报
回复
你的应用场合,比较适合使用UI线程,而不是工作组线程
贪食蛇男 2010-05-05
  • 打赏
  • 举报
回复
按我的理解,第二种方式也应该是0%才对。
taodm 2010-05-05
  • 打赏
  • 举报
回复
线程应该是消息驱动的,而不是死循环的。
SpirItKay 2010-05-05
  • 打赏
  • 举报
回复
我的本意是想让副线程作为客户端,副线程可以完全不关心性能和同步,就一个死循环也是合法的。
主线程作为服务端,由主线程控制副线程的开与关。
如果副线程只是一个死循环,那CPU必然上50%,所以我在主线程加上暂停和恢复操作,模拟Sleep()缓冲。
_JeffreyWu 2010-05-05
  • 打赏
  • 举报
回复
sleep
用的时候创建新线程
不用的时候销毁
赵4老师 2010-05-05
  • 打赏
  • 举报
回复
将线程里的注释去掉
jenf 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 spiritkay 的回复:]
to jenf:
第一个sleep我是想让副线程跑一毫秒再暂停,第二个sleep就相当于主线程的干了1毫秒的活的意思。
在第二个sleep期间,副线程被suspend了,还有机会被调度的么?
[/Quote]

第一个sleep后,副线程就又有可能被调度啊,因为sleep的原因就是想告诉系统,本线程不想被调度了,调度别的线程吧。
SpirItKay 2010-05-05
  • 打赏
  • 举报
回复
to cattycat:
这样啊。。。那我去研究研究消息同步。。。
SpirItKay 2010-05-05
  • 打赏
  • 举报
回复
to jenf:
第一个sleep我是想让副线程跑一毫秒再暂停,第二个sleep就相当于主线程的干了1毫秒的活的意思。
在第二个sleep期间,副线程被suspend了,还有机会被调度的么?
cattycat 2010-05-05
  • 打赏
  • 举报
回复
你的线程去掉了Sleep的话,一直在循环,不会主动停下来,肯定很占CPU的,CPU以线程为单位进行调度的,
时间片轮转的话,一般CPU都去执行线程了,主线程的Sleep几乎不管用。这么做不是好的设计,从来没有人这么做,不进行同步的死循环,几乎能占满CPU。
还是用消息在多个线程间同步吧。
jenf 2010-05-05
  • 打赏
  • 举报
回复
主线程负责控制另外线程的过程,你可以让主线程通过事件啊,消息啊等等通知子线程,控制其执行过程,
你的处理过程中
::ResumeThread(hThread);
Sleep(1);
::SuspendThread(hThread);
Sleep(1);
这第一个sleep基本没用,hThread一旦resume,就不停得循环,主线程不会立即获得CPU,就算某时候主线程终于被调度了,你一个sleep,子线程没准有被接着调度不停得循环。
SpirItKay 2010-05-05
  • 打赏
  • 举报
回复
去掉注释的Sleep(1)肯定就0%了,我是想副线程不出现Sleep()
死循环是必然50%的,两个死循环线程就100%
我就是纳闷为什么外部暂停恢复还是会占如此高的CPU
only_delusion 2010-05-05
  • 打赏
  • 举报
回复
还有你用float型 每次加1 死循环 用不了多久 就越界了吧.....
only_delusion 2010-05-05
  • 打赏
  • 举报
回复
应该是一样的才对.. 你把注释部分删除了 看看可不可以..?
线程的死循环应该不会耗费如此多的CPU
herman~~ 2010-05-05
  • 打赏
  • 举报
回复
副线程一直跑不加sleep,会死循环

这样的设计感觉有问题,
SpirItKay 2010-05-05
  • 打赏
  • 举报
回复
消息驱动我没用过喔,能推荐点文章让我学习学习么。
我再具体一点说,我是做机器人仿真的,一个机器人就对应一个控制程序,控制程序就是我上面说的副线程。
机器人的控制程序是由玩家自己编写的,因此我不希望用户需要对底层的线程进行操作,用户自由编写,即便是死循环也应该是合法的。例如:
main()
{
while(true)
{
SetMotor(1, 100); //设置一号马达速度为100
SetMotor(2, 100); //设置二号马达速度为100
}
}
这样的程序就是控制机器人直走。主线程对所有机器人都是启动了其的控制程序线程让他们各自运动。
我知道我这样从外部强制暂停和恢复线程是很不安全的,但是无奈想不出更好的办法。
希望大虾们能给点思路,谢谢。

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧