如果現(xiàn)在有個(gè)需求革答,線程池 同時(shí)用于收發(fā)網(wǎng)路消息战坤,那么就會(huì)出現(xiàn)個(gè)問(wèn)題,假如邏輯線程在向 線程池發(fā)送消息残拐,但是此時(shí)線程池途茫,正好處于epoll_wait那么我們此時(shí)就需要在發(fā)送曉得時(shí)候去通知,epoll_ctl (EPOLL_CTL_MOD)用于喚醒溪食。 加粗位置實(shí)現(xiàn)的喚醒操作囊卜。
那么libevent 是如何實(shí)現(xiàn)的呢,在bufferevent 初始化的時(shí)候
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;
}