在epoll中 一个socket上的某个事件可能被触发多次,采用线程池的方式来处理事件,可能一个socket同时被多个线程处理
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
mysql线程池对描述符socket注册了EPOLLONESHOT事件,则系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,如果下次再触发则必须使用epoll_ctl重置该描述符上注册的事件,包括EPOLLONESHOT 事件。
代码如下: handle_event->threadpool_process_request 执行完成后,如果需要线程池可以再处理次 socket的事件 需调用 start_io->io_poll_start_read,实现事件监听
static int io_poll_start_read(int pollfd
, int fd
, void *data
) {
struct epoll_event ev
;
ev
.data
.u64
= 0;
ev
.data
.ptr
= data
;
ev
.events
= EPOLLIN
| EPOLLET
| EPOLLERR
| EPOLLRDHUP
| EPOLLONESHOT
;
return epoll_ctl(pollfd
, EPOLL_CTL_MOD
, fd
, &ev
);
}