libevent 源码分析(多线程收发epoll_wait)

libevent 源码分析(多线程收发epoll_wait)_第1张图片
网上有篇epoll通用的博客,每次 EPOLLIN EPOLLOUT 都需要 epoll_ctl (EPOLL_CTL_MOD) 光是这样看,你会觉得很奇怪,为什么要修改,我收到数据 应用层就处理,为什么要修改?

如果现在有个需求,线程池 同时用于收发网路消息,那么就会出现个问题,假如逻辑线程在向 线程池发送消息,但是此时线程池,正好处于epoll_wait那么我们此时就需要在发送晓得时候去通知,epoll_ctl (EPOLL_CTL_MOD)用于唤醒。 加粗位置实现的唤醒操作。

那么libevent 是如何实现的呢,在bufferevent 初始化的时候

structbufferevent*

bufferevent_socket_new(structevent_base*base, evutil_socket_t fd,

intoptions)

{

structbufferevent_private*bufev_p;

structbufferevent*bufev;

#ifdefWIN32

if(base && event_base_get_iocp(base))

returnbufferevent_async_new(base, fd, options);

#endif

if((bufev_p = mm_calloc(1,sizeof(structbufferevent_private)))== NULL)

returnNULL;

if(bufferevent_init_common(bufev_p, base, &bufferevent_ops_socket,

options) < 0) {

mm_free(bufev_p);

returnNULL;

}

bufev = &bufev_p->bev;

evbuffer_set_flags(bufev->output, EVBUFFER_FLAG_DRAINS_TO_FD);

event_assign(&bufev->ev_read, bufev->ev_base, fd,

EV_READ|EV_PERSIST, bufferevent_readcb, bufev);

event_assign(&bufev->ev_write, bufev->ev_base, fd,

EV_WRITE|EV_PERSIST, bufferevent_writecb, bufev);

evbuffer_add_cb(bufev->output, bufferevent_socket_outbuf_cb, bufev);

evbuffer_freeze(bufev->input, 0);

evbuffer_freeze(bufev->output, 1);

returnbufev;

}

你可能感兴趣的:(libevent 源码分析(多线程收发epoll_wait))