综述:
在你使用libevent的方法之前,你需要创建一个或者多个event_base结构体,每个event_base容纳着一系列你想要监控的事件。等待事件的发生。如果你在初始化的时候使用了锁的机制,那event_base就是多线程安全的,如果你想要每个线程都等待某些事件的发生,你就需要每个线程拥有一个event_base。
在event_base的背后都有一个通过系统的借口获得事件通知的方法,他可以通过
-
select
-
poll
-
epoll
-
kqueue
-
devpoll
-
evport
-
win32
创建方式:
struct event_base* event_base_new();
该函数检查环境变量,并且生成一个event_base的对象,他定义在
如果你需要对他进行额外的配置还有几个接口可以使用:
struct event_config *event_config_new();
struct evnet_base * event_base_new_with_config(const struct event_config* cfg);
void event_config_free(struct event_config* cfg);
当你通过event_config生成event_new后,你就可以释放event_config了。
设置event_config的api如下:
int event_config_avoid_method(struct event_config *cfg, const char *method);
该函数让event_base避免选择一种底层的事件通知方式,例如method=“select”
设置event_config结构的接口如下:
enum event_method_feature {
EV_FEATURE_ET = 0x01, //必须支持边界触发模式
EV_FEATURE_O1 = 0x02, //增加事件和删除事件,复杂度必须为O(1)
EV_FEATURE_FDS = 0x04,
}; //必须支持多种文件描述符,不只是socket
int event_config_require_features(struct event_config *cfg, enum event_method_feature feature);
enum event_base_config_flag {
EVENT_BASE_FLAG_NOLOCK = 0x01, //不加锁
EVENT_BASE_FLAG_IGNORE_ENV = 0x02, //不需要检查EVENT_*系列的环境变量
EVENT_BASE_FLAG_STARTUP_IOCP = 0x04, //windows,使用IOCP,完成端口
EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10, //使用epoll changelist,慎重使用
EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
};
int event_config_set_flag(struct event_config *cfg, enum event_base_config_flag flag);
int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus);
int event_config_set_max_dispatch_interval(struct event_config *cfg, const struct timeval *max_interval, int max_callbacks, int
fmin_priority);
还有两个函数是负责获取event_base的可以使用的底层方法:
const char **event_get_supported_methods(void);
获取正在使用的底层方法:
const char *event_base_get_method(const struct event_base *base);
enum event_method_feature event_base_get_features(const struct event_base *base);
void event_base_free(struct event_base *base);
设置优先级的:
int event_base_priority_init(struct event_base *base, int n_priorities);
int event_base_get_npriorities(struct event_base *base);//获取支持的优先级,例如返回值3,表示0,1,2,3
如果在你的程序中使用了fork,你想要继续使用event_base,你需要调用:
int event_reinit(struct event_base *base);
例子:
点击(此处)折叠或打开
-
struct event_config *cfg;
-
struct event_base *base;
-
int i;
-
-
/* 我想使我的程序一个使用边界触发,一个不使用 */
-
for (i=0; i<2; ++i) {
-
cfg = event_config_new();
-
-
/*不想使用select */
-
event_config_avoid_method(cfg, "select");
-
-
if (i == 0)
-
event_config_require_features(cfg, EV_FEATURE_ET);
-
-
base = event_base_new_with_config(cfg);
-
event_config_free(cfg);
-
if (base)
-
break;
-
-
/* 如果成功会到达这里. */
- }