在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; /* Keep valgrind happy */
ev.data.ptr = data;
ev.events = EPOLLIN | EPOLLET | EPOLLERR | EPOLLRDHUP | EPOLLONESHOT;
return epoll_ctl(pollfd, EPOLL_CTL_MOD, fd, &ev);
}