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

网上有篇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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容