- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2010-07-05 12:09 编辑
怪现象:当客户端密集到达连接时,accept竟然会返回重复的s(socket),导致后边若干线程使用相同的socket,通信乱套了,内存也乱套了。
为此在成功create_thread后,特意usleep(10000);有改善,没根本解决。- 。。。。前边正常,略
- listen(sock,1000);
- while(1) {
- do {
- FD_ZERO(&efds);
- FD_SET(sock, &efds);
- //健康检查周期5分钟
- tm.tv_sec=300;
- tm.tv_usec=0;
- ret=select(sock+1,&efds,NULL,&efds,&tm);
- if(ret==-1) {
- ShowLog(1,"select error %s",strerror(errno));
- close(sock);
- quit(3);
- }
- if(ret==0 && poolchk) poolchk();
- } while(ret<=0);
- s=accept(sock,(struct sockaddr *)&cin,&leng);//就是返回的s有问题了。
- if(s<0) {
- ShowLog(1,"%s:accept err=%d,%s",__FUNCTION__,errno,strerror(errno));
- switch(errno) {
- case EMFILE: //fd用完了,其他线程还要继续工作,主线程休息一下。
- case ENFILE:
- sleep(60);
- continue;
- default:break;
- }
- sleep(3);
- if(++repeat < 20) continue;
- ShowLog(1,"%s:network fail! err=%s",__FUNCTION__,strerror(errno));
- close(sock);
- quit(5);
- }
- Conn.Socket=s;
- Conn.only_do=conn_init; //借用一下
- Conn.SendLen=sizeof_gda;
- ret=pthread_create(&pthread_id,&attr,thread_work,&Conn);
- if(ret) {
- ShowLog(1,"%s:pthread_create:%s",__FUNCTION__,strerror(ret));
- close(s);
- if(ret==EAGAIN||ret==ENOMEM) { //线程数用完了,休息一会,等一些线程退出
- sleep(30);
- }
- continue;
- }
- usleep(10000);//歇会
- }
- close(sock);
- quit(0);
- }
复制代码 |
|