创建一个event_base
每个event_base保存一堆event,而且可以测验出哪些events是激活了的
如果一个event_base是设置为用了锁,那么就是线程安全的。然而,如果你有很多个线程要进行IO操作,那么对于每个线程都需要创建一个event_base
每一个event_base都有一个工具,这些工具是:
** select poll epoll kqueue devpoll evport win32 **
你也可以关闭某个特定的工具,例如 kqueue,通过设置EVENT_NOKQUEUE环境变量关闭。如果想要在程序里关闭,可以用event_config_avoid_method
建立一个默认的event_base
event_base_new()函数从堆分配一个默认event_base对象,返回一个event_base的指针,出错返回NULL
接口
struct event_base* event_base_new(void);
建立一个复杂的event_base
event_config是一个保存特定event_base信息的结构体。如果要特定的event_base,将event_config传给函数event_base_new_with_config()
接口
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_config,用event_config_free去回收对象。
接口
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设置一些标签。
EV_FEATURE_ET:
需要工具支持边缘触发IO
EV_FEATURE_O1
需要工具支持插入删除激活event的复杂度是O(1)
EV_FEATURE_FDS
需要工具提供各种文件描述符,而不只是套接字。
EVENT_BASE_FLAG_NOLOCK
不给此event_base设置线程锁,多线程不安全。
示例:创建特定event_base
struct event_config* cfg;
struct event_base* base;
int i;
cfg = event_config_new();
event_config_avoid_method(cfg,"select");
event_config_require_feature(cfg,EV_FEATURE_ET);
base = event_base_new_with_config(cfg);
event_config_free(cfg);
回收event_base
调用函数 void event_base_free(struct event_base* base);
设置优先级
默认情况下,一个event_base只支持一个优先级,可以设置多个优先级通过调用接口
int event_base_priority_init(struct event_base* base,int n_priorities);
优先级参数至少为1,设置后优先级为0到n_priorities-1。Libevent支持的最高优先级为EVENT_MAX_PRIORITIES.
要找到当前event_base支持多少优先级通过调用函数
int event_base_get_npriorities(struct event_base* base);
fork后重新启动event_base
在创建新进程后还要继续使用之前event_base的话,最好重新初始化
接口:
int event_reinit(struct event_base* base);
.......
if(fork())
{
continue_running_parent(base);
}
else
{
event_reinit(base);
continue_running_child(base);
}
event_init(void);
早期版本的Libevent库有个全局默认event_base,可以被所有线程访问 ,如果绑定在这个默认的event_base上,这是线程不安全的。替代event_base_new()的是:
struct event_base* event_init(void);
这个将当前要绑定的base设为分配的base,而不是默认的base。