cpu占用率过高的问题

howema 2009-12-15 10:13:07
在程序中启用了一个线程,启用后cpu使用率达到80%,代码如下,高手帮忙分析下:

//********************************************************************
//启动接收线程
bool CUDPServer::StartRecv()
{
if(m_SckRecive==INVALID_SOCKET)
{
if(!CreateRecvSocket())
{
return false;
}
}

if(m_bReciveFlag)
{
return true;
}
m_RecvThread = CreateThread(NULL,0,OnReceiveThread,this,0,&m_ThreadID); //启动线程

if(m_RecvThread==NULL)
{
return false;
}
return true;
}
//********************************************************************
//停止接收线程
bool CUDPServer::StopRecv()
{
if(!m_bReciveFlag)
{
return true;
}
CLOSE_SOCKET(m_SckRecive);
if(m_RecvThread!=NULL)
{
WaitForSingleObject(m_RecvThread,INFINITE);
m_RecvThread = NULL;
m_ThreadID = 0;
}
return true;
}
//********************************************************************
//接收线程函数,
DWORD WINAPI CUDPServer::ReceiveThread(LPVOID lpParameter)
{
int addr_len;
struct sockaddr_in addr;
char szRecBuf[10000];
int iRecLen;
CUDPServer * pUDPServer;
pUDPServer = (CUDPServer *)lpParameter;
pUDPServer->m_bReciveFlag = true;

/*addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(pNetMultiCast->m_MultiCastPort);*/
while(pUDPServer->m_bReciveFlag)
{

addr_len = sizeof(addr);
iRecLen = recvfrom(pUDPServer->m_SckRecive,szRecBuf,10000,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen<=0)
{
pUDPServer->m_bReciveFlag = false;
}
else
{
szRecBuf[iRecLen] = 0;
printf("Receive from %s :%s\n",inet_ntoa(addr.sin_addr),szRecBuf);
}
}
printf("Receive Thread Ended.\n");
return 0;
}

//********************************************************************
void CUDPServer::OnReceive(long length)
{
//length 是socket列队中的第一个报文长度
//在本函数中可以进行业务的处理
char *pbuf;
int addr_len,iRecLen;;
struct sockaddr_in addr;
pbuf = new char[length+1];
memset(pbuf,0,length+1);
addr_len = sizeof(addr);
iRecLen = recvfrom(m_SckRecive,pbuf,length,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen<=0||iRecLen!=length)
{
// printf("Receive Failed!");
}
else
{
// CString str;

pbuf[length] = 0;
// str.Format("%s", pbuf);
// printf("Receive from %s :%s\n",inet_ntoa(addr.sin_addr),pbuf);
// TRACE("Recv fome %s:%s\n",inet_ntoa(addr.sin_addr),pbuf);
FILE *fp;
fp = fopen("log.txt","a");
fprintf(fp,"in onrecieve\n");
fprintf(fp,"%s\n",pbuf);
fclose(fp);
}
delete []pbuf;
pbuf = NULL;
}
//********************************************************************
DWORD WINAPI CUDPServer::OnReceiveThread(LPVOID lpParameter)
{
int ret;
unsigned long lLength;
CUDPServer * pUDPServer;
pUDPServer = (CUDPServer *)lpParameter;
pUDPServer->m_bReciveFlag = true;

while(pUDPServer->m_bReciveFlag)
{
ret = ioctlsocket(pUDPServer->m_SckRecive,FIONREAD,&lLength);
if(ret!=0)
{
pUDPServer->m_bReciveFlag = false;
}
else
{
if(lLength>0)
{
pUDPServer->OnReceive(lLength);
}
}
}
// printf("Receive Thread Ended.\n");
return 0;
}
...全文
143 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
maquan 2009-12-15
  • 打赏
  • 举报
回复
既然是单独的处理线程,就用“阻塞式IO”吧,显得“正宗”一点 :)

用 Sleep() 的话,多少会导致一点“响应不及时”的问题。
和黑1 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 microyzy 的回复:]
sleep的意思就是自己线程的事情做完了,把cpu交还给操作系统。如果不sleep,就意味着线程很有可能100%利用了系统分配给它的时间,并且还会成为一个活跃的cpu时间申请者,因此如果系统里没太多其他待调度的线程的话,这个线程就总会得到执行,这样一来cpu占用就高了。
[/Quote]
up
microyzy 2009-12-15
  • 打赏
  • 举报
回复
sleep的意思就是自己线程的事情做完了,把cpu交还给操作系统。如果不sleep,就意味着线程很有可能100%利用了系统分配给它的时间,并且还会成为一个活跃的cpu时间申请者,因此如果系统里没太多其他待调度的线程的话,这个线程就总会得到执行,这样一来cpu占用就高了。
csgdseed 2009-12-15
  • 打赏
  • 举报
回复
多线程一定要sleep
howema 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
while循环中Sleep一下
[/Quote]

果然如此,谢谢了,请问为什么要sleep才正常?
oyljerry 2009-12-15
  • 打赏
  • 举报
回复
while循环中Sleep一下

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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