您的位置:首页 > 其它

循环pthread_create导致虚拟内存上涨(续1)

2010-08-31 19:03 323 查看
前几天在博客里/article/6276511.html提出了一个问题,就是pthread_create导致虚拟内存上涨到极限的问题,下面项目里的实际代码阉割版,其中调用pthread_create的条件是多路I/O转接集中的相应的socket描述符有变化,即监听到链接,此时if条件成立调用pthread_create

代码

///
//include all header files needed
///

void * Client_TS_handle_ss_local_data_cmd(void * arg)
{
printf("enter local ss handler\n");

///
//forword the real-time data received from client-com-server to web-server
//through socket communication
///

printf("leave local ss handler\n");
pthread_detach(pthread_self());
pthread_exit(NULL);
}

void * Client_TS_handle_up_local_data_cmd(void * arg)
{
printf("enter local up handler\n");

///
//forword the historical data received from client-com-server to web-server
//through socket communication
///

printf("leave local up handler\n");
pthread_detach(pthread_self());
pthread_exit(NULL);
}

int main()
{
///
//initialize the server sockets
//Local_UP_Socket_fd
//Local_SS_Socket_fd
//Remote_Socket_fd
///

while(1)
{
FD_ZERO(&rset);
FD_SET(Local_UP_Socket_fd,&rset);
FD_SET(Local_SS_Socket_fd,&rset);
FD_SET(Remote_Socket_fd,&rset);
maxfd = max(Remote_Socket_fd,Local_SS_Socket_fd);
maxfd = max(maxfd,Local_UP_Socket_fd);

if(select(maxfd+1,&rset,NULL,NULL,NULL) < 0)
{
if(errno == EINTR)
continue;
else
{
fprintf(stderr,"Select error : %s\n",strerror(errno));
exit(1);
}
}

if(FD_ISSET(Remote_Socket_fd,&rset))
{
printf("Remote Data/Cmd Recved\n");
}

if(FD_ISSET(Local_UP_Socket_fd,&rset))
{
if(pthread_create(&_local_up_thread,NULL,Client_TS_handle_up_local_data_cmd,(void *)&UPPara)!=0)
{
perror("Error Creating UP Thread");
}
}

if(FD_ISSET(Local_SS_Socket_fd,&rset))
{
if(pthread_create(&_local_ss_thread,NULL,Client_TS_handle_ss_local_data_cmd,(void *)&SSPara)!=0)
{
perror("Error Creating SS Thread");
}
}
}

close(Remote_Socket_fd);
close(Local_SS_Socket_fd);
close(Local_UP_Socket_fd);
exit(0);
}
/*    End of File    */


今天老师跟我提了个意见就是去找问题源,即向监听socket提出链接的客户端,查看该客户端是否也是在循环里无休止地提出链接请求,如果是这样的话,把源问题解决了就可以解决前文提出的问题

顺着老师的意见,查看客户端程序,主要代码如下

while(!feof(fhandle))
{
fgets(fhandle);
if(feof(fhandle))
{
fseek(fhandle);
continue;
}
senddata();    //socket communication
sleep(WAITTIME);
}


从以上代码可以看出,客户端并不是无理取闹那样无休止地提出连接请求,而是有一定的sleep(),当然了这个WAITTIME可以人为修改,项目中设置为10s,想一下间隔10s发送数据并不是很过分,只不过每次发送12004bytes的数据容易造成拥挤,而且实际中发送的数据可能不止这些,因此pthread_create()导致虚拟内存上涨的问题很是程序设计的不合理,有待解决,如果有好的建议,欢迎指点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: