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

在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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值