6. 线程安全
libevent不是线程安全的,libevnet里网络io都是单线程里处理。
其它线程调用event_base_loopexit 和 event_base_loopbreak 并不会使当前线程从event_base_dispatch返回。
同理,其它线程调用bufferevent_free,可能引起异常。
所以,event_base_loopexit 和 event_base_loopbreak 以及 bufferevent_free的调用仅限于当前主线程的读写事件回调中,若从其它线程对event_base和bufferevent进行操作,或者达不到预期的效果,或者引起主线程的异常。
5. 开启循环
函数原型:
#define EVLOOP_ONCE 0x01
#define EVLOOP_NONBLOCK 0x02
#define EVLOOP_NO_EXIT_ON_EMPTY 0x04
int event_base_loop(struct event_base *base, int flags);
功能:开启监测,循环监测注册在此event_base上的事件
同类函数:
int event_base_dispatch(struct event_base *base);
等于不设置任何标志的event_base_loop,一直运行,直至注册在上面的事件全部关闭,或调用event_base_loopexit和event_base_loopbreak跳出循环
4. 停止循环
函数原型:
int event_base_loopexit(struct event_base *base, const struct timeval *tv);
int event_base_loopbreak(struct event_base *base);
3. 开关读写事件
函数原型:
void bufferevent_enable(struct bufferevent *bufev, short events);
void bufferevent_disable(struct bufferevent *bufev, short events);
同时可以调用如下函数
short bufferevent_get_enabled(struct bufferevent *bufev);
查看对应bufferevent上开启的事件类型
2. 事件回调函数
函数原型:typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short events, void *ctx);
1. 设置超时
函数原型:void bufferevent_set_timeouts(
struct bufferevent *bufev,
const struct timeval *timeout_read,
const struct timeval *timeout_write);
参数:超时指针为NULL,表示对应操作无超时,同时抹除之前已设置的超时
说明:相应操作未开启,则超时设置无意义,永不触发
回调
a. 指定的时间内,套接字上无数据到达,则触发读超时;写超时,暂未掌握
b. 超时发生,则以BEV_EVENT_TIMEOUT|BEV_EVENT_READING 或 BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING事件标志位调用事件回调函数bufferevent_event_cb
c. 读写超时发生,则该bufferevent上对应的读操作或写操作自动失效,若想继续等待,需调用bufferevent_enable开启事件