mysql源码-线程池-如何保证仅有一个线程处理socket通信-EPOLLONESHOT

    技术2022-07-11  134

    在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); }
    Processed: 0.012, SQL: 9