- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2013-02-22 11:10 编辑
iw1210 发表于 2013-02-22 10:53 ![]()
才10个连接就不行了,不会吧,几个线程用select?
一个专用线程进行select和任务分派。- void *sched(void *arg)
- {
- int stat,i;
- char beatbuff[CONN_MAXFD+1];
- fd_set rf,wf,ef;
- fprintf(stderr,"sched:start!\n");
- FD_ZERO(&rfds);
- FD_ZERO(&wfds);
- FD_ZERO(&efds);
- stat=pipe2(beat,O_NONBLOCK);
- if(stat<0) {
- fprintf(stderr,"create pipe beat err=%d:%s\n",
- errno,strerror(errno));
- return NULL;
- }
- while(1) {
- rf=rfds;
- wf=wfds;
- ef=efds;
- FD_SET(beat[0],&rf);
- stat=select(CONN_MAXFD+1,&rf,&wf,&ef,NULL);
- if(stat<0) break;
- // pthread_mutex_lock(&beatLock);
- beatc=0;
- // pthread_mutex_unlock(&beatLock);
- fprintf(stderr,"sched:stat=%d\n",stat);
- for(i=0;i<CONN_MAXFD;i++) {
- stat=0;
- if(FD_ISSET(i,&rf)) {
- if(i==beat[0]) {
- read(beat[0],beatbuff,sizeof(beatbuff));
- continue;
- }
- stat |= EV_IN;
- FD_CLR(i,&rfds);
- }
- if(FD_ISSET(i,&wf)) {
- stat |= EV_OUT;
- FD_CLR(i,&wfds);
- }
- if(FD_ISSET(i,&ef)) {
- stat |= EV_ERR;
- FD_CLR(i,&efds);
- }
- if(stat) {
- g_conn_table[i].events=stat;
- pthread_mutex_lock(&rdyLock);
- q_add(i,&rdy_q);//加入就绪队列
- pthread_mutex_unlock(&rdyLock);
- pthread_cond_signal(&rdyCond);
- }
- }
- }
- shut_server=1;
- close(beat[0]);
- close(beat[1]);
- }
复制代码 |
|