libevent

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开启事件

原文地址:https://www.cnblogs.com/chaikefusibushiji/p/6775738.html