大家节日愉快,关于线程CPU的问题

max_xy 2004-05-01 09:48:21
我做了一个客户端的线程类,这个线程不断地从服务器读取数据,然后处理。服务器端是不断地在一个while(1)里发送数据。我现在在我的客户端的线程里也是用while(1)来读取数据并且处理,现在发现CPU一般维持在20%左右(加了sleep(20)),但是问题是如果我同时开了4个线程,CPU就高达90%了。请问我该怎么办,有没有什么高招降低CPU啊。不用while循环,我用什么呢,这种情况下面。
...全文
51 6 打赏 收藏 转发到动态 举报
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模型的

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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