社区
进程/线程/DLL
帖子详情
大家节日愉快,关于线程CPU的问题
max_xy
2004-05-01 09:48:21
我做了一个客户端的线程类,这个线程不断地从服务器读取数据,然后处理。服务器端是不断地在一个while(1)里发送数据。我现在在我的客户端的线程里也是用while(1)来读取数据并且处理,现在发现CPU一般维持在20%左右(加了sleep(20)),但是问题是如果我同时开了4个线程,CPU就高达90%了。请问我该怎么办,有没有什么高招降低CPU啊。不用while循环,我用什么呢,这种情况下面。
...全文
51
6
打赏
收藏
大家节日愉快,关于线程CPU的问题
我做了一个客户端的线程类,这个线程不断地从服务器读取数据,然后处理。服务器端是不断地在一个while(1)里发送数据。我现在在我的客户端的线程里也是用while(1)来读取数据并且处理,现在发现CPU一般维持在20%左右(加了sleep(20)),但是问题是如果我同时开了4个线程,CPU就高达90%了。请问我该怎么办,有没有什么高招降低CPU啊。不用while循环,我用什么呢,这种情况下面。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
UDX协议
2004-05-03
打赏
举报
回复
BOOL CClientOverlappedSock::OnRead()
{
if(!IsConnected())
return false;
DWORD dwTransbit = 0;
DWORD Resv = 0;
DWORD dwFlag = 0;
WSABUF buffer;
BOOL bQuery = false;
int state = 0;
bQuery = WSAGetOverlappedResult( m_RecSocket, &ConnectedSocketOverlapped,
&dwTransbit,false,&dwFlag);
if(bQuery)
{
if(dwTransbit == 0)
{
OnClose();
return true;
}
while(1)
{
if( rPag.len - sizeof(PAG) == DataRes)
{
////
Work();
Reset();
////
buffer.buf = (char*)& rPag;
buffer.len = sizeof(PAG);
state = WSARecv( m_RecSocket,&buffer,1,&Resv,
&dwFlag, &ConnectedSocketOverlapped,NULL);
if(state == 0)
{
continue;
}else
{
DWORD err = WSAGetLastError();
if(err != WSA_IO_PENDING)
{
TRACE1("erro code1 %d\n",err);
OnClose();
return false;
}else
{
if(ERROR_IO_PENDING == err)
{
return true;
}
}
}
}else
if( rPag.len - sizeof(PAG) - DataRes > 0)
{
if(!m_bReadPending)
{
if(buff == NULL)
{
buff = new char [ rPag.len - sizeof(PAG)];
memset( buff,0, rPag.len - sizeof(PAG));
buffer.buf = buff;
buffer.len = rPag.len - sizeof(PAG);
}
Resv = 0;
buffer.len = rPag.len - sizeof(PAG) - DataRes;
buffer.buf = buff + DataRes;
state = WSARecv( m_RecSocket,&buffer,1,&Resv,
&dwFlag, &ConnectedSocketOverlapped,NULL);
if(state == 0)
{
DataRes+=Resv;
continue;
}else
{
DWORD err = WSAGetLastError();
if(err != WSA_IO_PENDING)
{
TRACE1("erro code2 %d\n",err);
OnClose();
return false;
}else
{
if(ERROR_IO_PENDING == err)
{
m_bReadPending = true;
return true;
}
}
}
}else
{
DataRes+=dwTransbit;
}
}
if(!IsConnected())
return 0;
Sleep(1);
TRACE1("RES DATA IS %u\n",DataRes);
}
}else
{
DWORD err = WSAGetLastError();
if(err != ERROR_IO_INCOMPLETE)
{
OnClose();
TRACE1("erro code3 %d\n",err);
return false;
}else
return true;
}
return true;
}
吐血回贴!
当没有数据来时,根本不占用cpu.
B2China
2004-05-02
打赏
举报
回复
呵呵,我的接收线程的问题和你一样:
帖子:
http://expert.csdn.net/Expert/topic/3027/3027977.xml?temp=.7697565
主题:
大家的接收线程是怎么实现的啊?怎么我的接收线程消耗CPU资源这么大啊?
期待答案!
halk
2004-05-01
打赏
举报
回复
Onega(www.fruitfruit.com) 说的有道理,阻塞的socket在阻塞期间处于等待状态,此时线程不可调度,因此不会分配给cpu时间;如果用非阻塞,则线程在while期间一直处于可调度状态,系统就会分配给cpu时间,即使这些时间都浪费在无用的循环上了。
max_xy
2004-05-01
打赏
举报
回复
呵呵,楼上的,估计没有仔细看我的第一个帖子。
Onega
2004-05-01
打赏
举报
回复
用while是使用阻塞式socket的方法,对于非阻塞的socket不能那么做
http://www.codersource.net/winsock_tutorial_server_event_model.html
http://www.codeproject.com/internet/networkevents.asp
max_xy
2004-05-01
打赏
举报
回复
我在while循环里用的是非阻塞socket,用SELECT模型的
电商节日营销:移动端大转盘抽奖活动H5模板
本文介绍的移动端大转盘抽奖活动页面模板旨在结合节日营销提升购物热情。模板设计需注重用户体验、视觉吸引力、交互设计、数据管理、安全性、H5技术应用、兼容性、营销策略及数据分析等方面,以确保活动页面的吸引力...
阿里面试官没想到,一个Volatile,我都能跟他吹半小时
多
线程
核心加分点
1024,一封写给CSDN家园Python初学者的信 | Python初级、中级、高级学习路线
又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好。转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩。非常遗憾,这次没能去长沙岳麓书院见很多大佬和博友...
把 14 亿中国人都拉到一个微信群,在技术上能实现吗?
好了,有了这么多设备加持,这下你终于可以愉快地进了群。 但你惊讶地发现,屏幕上除了白色,什么都没有—— 这是因为你的眼睛没办法接收这么快的数据! 人眼的视觉暂留时间是 100-400 毫秒[参考 9] ,而我们这个群...
寒假python培训
又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好。转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩。非常遗憾,这次没能去长沙岳麓书院见很多大佬和博友...
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章