当前位置: 技术问答>linux和unix
tcp中使用recv函数cpu占用率99%
来源: 互联网 发布时间:2016-09-09
本文导语: 在LINUX下编程,平台ARM9,客户端现在使用recv(read)接收数据线程,只要这个线程启动此线程cpu占用率就到99%,recv不是阻塞式的吗。改用selcet也一样,不知道为什么,我服务器端用相同的代码cpu占用率很低。太郁闷了...
在LINUX下编程,平台ARM9,客户端现在使用recv(read)接收数据线程,只要这个线程启动此线程cpu占用率就到99%,recv不是阻塞式的吗。改用selcet也一样,不知道为什么,我服务器端用相同的代码cpu占用率很低。太郁闷了。下面是我的代码请高手指教。
while(ture)
{
FD_ZERO(&rfds);
FD_SET(link_data->para.fd,&rfds);
if (select(1 + link_data->para.fd, &rfds, NULL,NULL,&tv) > 0)
{
if(FD_ISSET(link_data->para.fd,&rfds))
{
//len = recv(link_data->para.fd, &link_data->frame,
LINK_FRAME_LEN, 0);
len = read(link_data->para.fd, &link_data->frame,
LINK_FRAME_LEN);
if(len > 0)
{
analyse_link_data(link_data, len);
}
else if(len para.fd != -1)
{
close(link_data->para.fd);
link_data->para.fd = -1;
link_data->para.call_status = CALL_FREE;
}
ture = 0;
}
}
}
}
while(ture)
{
FD_ZERO(&rfds);
FD_SET(link_data->para.fd,&rfds);
if (select(1 + link_data->para.fd, &rfds, NULL,NULL,&tv) > 0)
{
if(FD_ISSET(link_data->para.fd,&rfds))
{
//len = recv(link_data->para.fd, &link_data->frame,
LINK_FRAME_LEN, 0);
len = read(link_data->para.fd, &link_data->frame,
LINK_FRAME_LEN);
if(len > 0)
{
analyse_link_data(link_data, len);
}
else if(len para.fd != -1)
{
close(link_data->para.fd);
link_data->para.fd = -1;
link_data->para.call_status = CALL_FREE;
}
ture = 0;
}
}
}
}
|
把analyse_link_data()置成空函数看一下,看性能瓶颈在哪里
|
每次select都需要重置tv值
|
你确定是这个线程本身占用了大量的CPU时间?