美文网首页
libevent 源码分析(多线程收发epoll_wait)

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

作者: ad5acc80c173 | 来源:发表于2016-04-04 23:21 被阅读0次
    网上有篇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)

          本文链接:https://www.haomeiwen.com/subject/nlxulttx.html