select CPU占用太大

rongxiaojun 2014-04-28 03:48:33
编写并发测试工具

创建了1000个线程,每个线程维持一个select,每个select管理64个SOCKET,但是cpu占用率高达100%,电脑卡的不能动。

每个SOCKET的动作仅仅是连接server,发送请求,等待接收,断开连接,再添加新SOCKET。。。。。

之前的设计是这样的:改小线程栈,创建4000线程,连-发-收-断-再连,也不至于电脑卡的不动

为何出现这种问题?

...全文
676 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rongxiaojun 2014-04-29
  • 打赏
  • 举报
回复
四核CPU,每个都在疯狂的跑,当然卡死了。 就是创建4个线程,每个while(1) {//do nothing} 机器卡的更死。
rongxiaojun 2014-04-29
  • 打赏
  • 举报
回复
引用 10 楼 yiyefangzhou24 的回复:
引用 8 楼 rongxiaojun 的回复:
我现在就想知道有谁用过select多线程,线程数在200以上,cpu占用是不是也高达100%?
只要写的好,200个线程对于windows下的线程调度来说还是毫无压力的,不在乎你线程的多少,而在于你的设计,线程过多最好采用线程池,
查了一下,关键还是线程里面的问题,为了测试并发度,每个线程一开始就创建64个socket连接服务器,然后直接return,就这么简单的线程开1000个,机器也卡的要死。
yiyefangzhou24 2014-04-28
  • 打赏
  • 举报
回复
引用 8 楼 rongxiaojun 的回复:
我现在就想知道有谁用过select多线程,线程数在200以上,cpu占用是不是也高达100%?
只要写的好,200个线程对于windows下的线程调度来说还是毫无压力的,不在乎你线程的多少,而在于你的设计,线程过多最好采用线程池,
ztenv 版主 2014-04-28
  • 打赏
  • 举报
回复
是不是出现了死循环?或由于条件的判断导致了continue?检查一下,不会无故100%的情况的,不过你的线程数太多太多了,必须要改进的,
rongxiaojun 2014-04-28
  • 打赏
  • 举报
回复
我现在就想知道有谁用过select多线程,线程数在200以上,cpu占用是不是也高达100%?
yiyefangzhou24 2014-04-28
  • 打赏
  • 举报
回复
根据需求你也可以自己设计模型,不必拘泥于给你封装好的模型接口,1000个线程,每个线程中进行64次select,你不能光 for(int i=0;i<1000;i++) { CreateThreadEx(); } 这么做有可能,只是可能也要看系统是什么和机器的承受能力,使得系统CPU超载。跟重要的是线程中做了什么。 实在觉得你的模型不太好改,试试线程池
yiyefangzhou24 2014-04-28
  • 打赏
  • 举报
回复
引用 5 楼 rongxiaojun 的回复:
[quote=引用 3 楼 yiyefangzhou24 的回复:] select的超时时间的问题,我的超时时间是NULL,也就是阻塞。是这个问题吗? 是的。 你既然select了还要开1000个线程的原因是什么?,select函数所做的事情你清楚吗?多看看
windows下select FD_SET默认最大64,测试程序并发量,1000个线程也就6.4W,开1000个多吗? 我的超时时间就是NULL,无限阻塞,后来改为3s 500ms都不解决问题,还是卡的不行。所以问题不是这里。[/quote]我不是说你线程多不多,而是说你模型选美选对
rongxiaojun 2014-04-28
  • 打赏
  • 举报
回复
引用 3 楼 yiyefangzhou24 的回复:
select的超时时间的问题,我的超时时间是NULL,也就是阻塞。是这个问题吗? 是的。 你既然select了还要开1000个线程的原因是什么?,select函数所做的事情你清楚吗?多看看
windows下select FD_SET默认最大64,测试程序并发量,1000个线程也就6.4W,开1000个多吗? 我的超时时间就是NULL,无限阻塞,后来改为3s 500ms都不解决问题,还是卡的不行。所以问题不是这里。
QQ515311445 2014-04-28
  • 打赏
  • 举报
回复
因为每个线程都要分配一个栈,线程越多,分配的总量就越多,导致使用的内存就越多,内存不够用当然就变慢了. 减小线程栈后,内存使用变少,当然就恢复正常了
yiyefangzhou24 2014-04-28
  • 打赏
  • 举报
回复
select的超时时间的问题,我的超时时间是NULL,也就是阻塞。是这个问题吗? 是的。 你既然select了还要开1000个线程的原因是什么?,select函数所做的事情你清楚吗?多看看
rongxiaojun 2014-04-28
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
线程不要太多;选择适合自己的通信 模型,不要一味的靠创建线程来提高并发,这样做的意义真的不大;
问题是之前4000个线程都不会卡,现在每个线程跑select、1000个就卡的不行,原因呢? 听说是select的超时时间的问题,我的超时时间是NULL,也就是阻塞。是这个问题吗?
ztenv 版主 2014-04-28
  • 打赏
  • 举报
回复
线程不要太多;选择适合自己的通信 模型,不要一味的靠创建线程来提高并发,这样做的意义真的不大;

64,654

社区成员

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

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