【 在 ylh1969 的大作中提到: 】
:
: // 将 context 投入线程池
: pool.enqueue([this, ctx] { handleConnection(ctx); });
: ...................
每个线程完成初始化后进入死循环。
while(1) {
//从就绪队列取一个任务,解决非IO事件,如获取连接池,获取数据库句柄等等。
pthread_mutex_lock(&rpool.mut);
while(!(task=rdy_get())) {//留1个线程在此即可,其余去epoll_wait
if(rpool.flg >= tpool.rdy_num) break;
rpool.flg++;
ret=pthread_cond_wait(&rpool.cond,&rpool.mut); //没有任务,等待
rpool.flg--;
}
pthread_mutex_unlock(&rpool.mut);
if(task) {
if(!task->AIO_flg && !task->call_back) {
task->fd=task->conn.Socket;
ShowLog(5,"%s:tid=%lx,TCB_no=%d from rdy_queue",__FUNCTION__,
pthread_self(),task->sv.TCB_no);
if(task->fd>=0) {
do_epoll(task,0,0);
}
continue;
}
} else {
fds = epoll_wait(g_epoll_fd, &event, 1 , -1);
if(fds < 0){
ShowLog(1,"%s:epoll_wait err=%d,%s",__FUNCTION__,errno,strerror(errno));
usleep(30000000);
continue;
}
task = (TCB *)event.data.ptr;
if(task->events) {
ShowLog(1,"%s:tid=%lx,TCB_no=%d,task->events=%08X,conflict!",__FUNCTION__,
pthread_self(),task->sv.TCB_no,task->events);//发现惊群
task=NULL;
continue;//丢掉它
}
task->events=event.events;
}
rs->timestamp=now_usec();
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*