循环pthread_create导致虚拟内存上涨(续1)
2010-08-31 19:03
323 查看
前几天在博客里/article/6276511.html提出了一个问题,就是pthread_create导致虚拟内存上涨到极限的问题,下面项目里的实际代码阉割版,其中调用pthread_create的条件是多路I/O转接集中的相应的socket描述符有变化,即监听到链接,此时if条件成立调用pthread_create
代码
今天老师跟我提了个意见就是去找问题源,即向监听socket提出链接的客户端,查看该客户端是否也是在循环里无休止地提出链接请求,如果是这样的话,把源问题解决了就可以解决前文提出的问题
顺着老师的意见,查看客户端程序,主要代码如下
从以上代码可以看出,客户端并不是无理取闹那样无休止地提出连接请求,而是有一定的sleep(),当然了这个WAITTIME可以人为修改,项目中设置为10s,想一下间隔10s发送数据并不是很过分,只不过每次发送12004bytes的数据容易造成拥挤,而且实际中发送的数据可能不止这些,因此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()导致虚拟内存上涨的问题很是程序设计的不合理,有待解决,如果有好的建议,欢迎指点
相关文章推荐
- 循环pthread_create导致虚拟内存上涨(续2)
- 循环pthread_create导致虚拟内存上涨
- pthread_create后没有detach导致内存持续增长
- pthread_jion() , pthread_create() 导致的segmentation fault
- pthread_jion() , pthread_create() 导致的segmentation fault
- Linux-pthread_create使用不当可能导致内存泄露
- 隐蔽的内存泄漏——pthread_create 属性设置不当导致
- pthread_create导致的程序崩溃
- pthread_create 参数传递指针问题(创建多线程时,循环变量的传递)
- 隐蔽的内存泄漏——pthread_create 属性设置不当导致
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 隐蔽的内存泄漏——pthread_create 属性设置不当导致
- pthread_create 导致内存泄露
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- pthread_create后没有detach导致内存持续增长
- 一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- “鼠标拖动游戏窗口,消息循环会卡住,导致游戏不能更新不能渲染”,解决办法在这里
- undefined reference to 'pthread_create'问题解决
- pthread_create