libevent学习笔记 - 2 event_base

时间:2021-06-01 00:16:22

0 Preliminaries
1 设置 Libevent库
2 event_base

在使用libevent时需要分配一个或多个event_base,每个event_base持有多个event,还能够决定哪一个event处于活动状态。为了多线程访问安全,event_base可加锁,但是同一时刻只能有一个线程在运行loop。
每个event_base都有自己的“method”或后台决定哪个event是待运行状态,“method”包括以下这些:select、poll、epoll、kqueue、devpoll、evport、win32。调用者可以通过变量关闭特定后台。例如你想关闭kqueue后台就设置环境变量EVENT_NOKQUEUE等。

  • 创建默认设置的event_base

event_base_new()可以分配并返回一个默认设置的event_base,出错则返回NULL,对于大多数程序来说,默认设置生成的event_base的足够使用了。 event_base_new()函数声明在文件“event2/event.h”,在版本1.4.3第一次开始使用。

struct event_base *event_base_new(void);
  • 创建复杂的event_base

通过event_config可自定义event_base。event_config可存储关于一个event_base的偏好设置信息,可通过向函数 event_base_new_with_config()传入event_config来获取想要的event_base。

struct event_config *event_config_new(void);
struct event_base *event_base_new_with_config(const struct event_config *cfg);
void event_config_free(struct event_config *cfg);

通过event_config_new()生成event_config,然后调用其他函数对其设置个人需求,最后调用event_base_new_with_config()生成event_base,使用完以后通过调用 event_config_free()释放event_config。

int event_config_avoid_method(struct event_config *cfg, const char *method);

enum event_method_feature {
EV_FEATURE_ET = 0x01,
EV_FEATURE_O1 = 0x02,
EV_FEATURE_FDS = 0x04,
}
;
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_BASE_FLAG_STARTUP_IOCP = 0x04,
EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,
EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
}
;
int event_config_set_flag(struct event_config *cfg,
enum event_base_config_flag flag);

调用event_config_avoid_method()函数通知Libevent 通过名字消除特定功能的后台;调用event_config_require_feature()通知Libevent不使用不具有该属性的的后台;调用event_config_set_flag()通知Libevent构造event base时设置一个或多个运行时标识。

常用特征值有以下几种:
EV_FEATURE_ET :后台方法需支持 edge-triggered IO
EV_FEATURE_O1 :要求后台方法增删单一event或者将某event激活,是一个O(1)操作。
EV_FEATURE_FDS:要求后台方法不仅支持sockets,而且可以支持任意文件描述符类型。

event_config_set_flag()函数常用选项值有以下几种:
EVENT_BASE_FLAG_NOLOCK :不为event_base分配锁,设置此选项可以节省一点时间锁定和释放的event_base ,但是也会使多线程访问时变得不安全。
EVENT_BASE_FLAG_IGNORE_ENV:当选择使用哪个后台方法时不会检查EVENT_*环境变量,若是打算使用该标识请三思而后行:它会增加使用者调试Libevent与程序之间相互作用的难度。
EVENT_BASE_FLAG_STARTUP_IOCP:只适用于windows,
EVENT_BASE_FLAG_NO_CACHE_TIME:每次超时回调才会检查,而不是event loop一直实时检查。
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST :
EVENT_BASE_FLAG_PRECISE_TIMER :

注意:因为操作系统的区别(例如windows,linux)如果调用event_config配置了Libevent在该系统下无法提供的设置,event_base_new_with_config()将返回NULL

(待更新)