循环创建线程(::_beginthreadex),CPU 100%问题

cgd0282 2009-07-18 12:49:16
在主窗口类中
void CMainDlg::OnButton(UINT uNotifyCode, int nID, CWindow wndCtl)
{
HANDLE h[60];
for (int i = 0; i< 60; i++)
{
h[i] = (HANDLE)::_beginthreadex(NULL, 0, Dummy_SendThread, this, 0, NULL);
//Sleep(1);
}
}
界面上使用按钮触发创建多个线程,点击按钮有时界面会卡住,CPU100%; Dummy_SendThread函数里直接返回0;没做任何处理;
如果加上Sleep(1);时.好像就没问题;不知大家有没遇过?
...全文
271 20 打赏 收藏 举报
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mayasongzibin 2009-07-20
你在较短的时间间隔创建了60个线程,占用了大部分中央处理器时间,当然系统很忙,如果加上另外的时间

消息,可让中央处理器分出时间片来处理了,建议使用线程池建立多个线程
  • 打赏
  • 举报
回复
lwd4210 2009-07-19
哪个机器跑60个就不动了的.
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
发觉加上Sleep(1); 按钮拼命点程序还是会卡掉;
  • 打赏
  • 举报
回复
pady_pady 2009-07-18
他说过了,线程函数直接返回0,只有一句话:return 0;
加了sleep(1),按钮界面让出时间段,界面会小卡一会,但CPU变化不大的呵呵,等于是每次运行一个线程,而这个线程又马上返回了,系统基本在同一时间只增加一个线程调度,不会占用太多CPU,
不加sleep(0),在按钮运行的时候时间段里,可能瞬间要产生N个线程,系统要忙着为这几个线程分配空间的初始化呢,CPU自然就上去了,界面线程有可能分不到时间段,就假死在那里了
  • 打赏
  • 举报
回复
pady_pady 2009-07-18
他说过了,线程函数直接返回0,只有一句话:return 0;
加了sleep(1),按钮界面让出时间段,界面会小卡一会,但CPU变化不大的呵呵,等于是每次运行一个线程,而这个线程又马上返回了,系统基本在同一时间只增加一个线程调度,不会占用太多CPU,
不加sleep(0),在按钮运行的时候时间段里,可能瞬间要产生N个线程,系统要忙着为这几个线程分配空间的初始化呢,CPU自然就上去了,界面线程有可能分不到时间段,就假死在那里了
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
Dummy_SendThread什么都不做的.直接 return 0;
这才叫郁闷.
  • 打赏
  • 举报
回复
oyljerry 2009-07-18
[Quote=引用 10 楼 cgd0282 的回复:]
好像问题在 _beginthreadex函数, 不返回.
[/Quote]
线程函数Dummy_SendThread中做了什么,线程少创建一点呢..
  • 打赏
  • 举报
回复
bylea 2009-07-18
你得线程体是不是空的?或是执得的时间非常非常短?
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
好像问题在 _beginthreadex函数, 不返回.
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
我也试过不在界面消息函数里创建线程;我开了个线程A; 然后在A里循环创建60个线程.一样存在这种问题;
郁闷中...而且这情况不是每次都会.是有时发生而已
  • 打赏
  • 举报
回复
bylea 2009-07-18
void CMainDlg::OnButton(UINT uNotifyCode, int nID, CWindow wndCtl)

这个是阻塞式调用,它会把界面消息阻塞住,直到这个函数退出才会有新的消息得到执行.
而这期间,大量的反复创建线程,会使CPU占用率直线上升,从而使界面挂住.
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
不加Sleep(1),主线程在一瞬间创建了60个线程,多个线程之间的切换导致了短时间内CPU 占用率太高 ;
我就是等上半个小时.程序一样挂在那不动,界面什么都点不了!
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
主要是线程切换消耗CPU时间,导致界面线程得不到时间片~~
不是很明白你的意思, 我才创建60个线程.尽管线程切换消耗CPU时间;那也不大可能卡到连机器都动不了啊.WINDOW不是可以同时跑上百个线程的吗?那些服务器不同时搞了上百个线程跑.再说了我这线程一开启就结束掉的;
  • 打赏
  • 举报
回复
ZOthello 2009-07-18
主要是线程切换消耗CPU时间,导致界面线程得不到时间片~~
  • 打赏
  • 举报
回复
ZOthello 2009-07-18
主要是线程切换消耗CPU时间,导致界面线程得不到时间片~~
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
刚打了vs2005 sp1补丁.好像没问题了.晕死!
在此谢谢各位热心帮助......
  • 打赏
  • 举报
回复
bylea 2009-07-18
看了你的描述,好像是要启动大量的线程,线程反复创建会消息大量的时间.

这个还是自己写个线程池吧,每次可以少创建几个,依需要增加就可以了.(例子在这个论坛中搜一下就有了.)
  • 打赏
  • 举报
回复
cgd0282 2009-07-18
机器不同.情况确实不同, 情况是这样的.在家里机器慢.试不到10次就会出现一次挂掉.公司机器好.要试几十次才会出现一次挂掉;哈哈
  • 打赏
  • 举报
回复
marrco2005 2009-07-18
不加Sleep(1),主线程在一瞬间创建了60个线程,多个线程之间的切换导致了短时间内CPU 占用率太高

加上那个Sleep(1) 之后
主线程每创建一个线程后就让出时间片,执行其他的线程,而其他线程什么也不做,就直接退出了。所以同一时刻同时运行的线程并不多,也就不会发生线程之间的频繁切换
  • 打赏
  • 举报
回复
marrco2005 2009-07-18
[Quote=引用 7 楼 cgd0282 的回复:]
不加Sleep(1),主线程在一瞬间创建了60个线程,多个线程之间的切换导致了短时间内CPU 占用率太高 ;
我就是等上半个小时.程序一样挂在那不动,界面什么都点不了!
[/Quote]
那是你机器出了问题
  • 打赏
  • 举报
回复
相关推荐
发帖
进程/线程/DLL

1.5w+

社区成员

VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
帖子事件
创建了帖子
2009-07-18 12:49
社区公告
暂无公告