Libevent之event_base篇

使用Libevent库函数进行编程时,我们一般需要先分配一个或多个event_base结构体。每一个event_base都包含了一组事件,并且通过轮询确定哪些事件是激活的。

每一个event_base都有一个“方法”(或称 “后端”(backend)),用来确定哪些事件是激活了的。这些“方法”主要有:select, poll, epoll, kqueue, devpoll, evport, win32等。用户可以使用环境变量来禁止某个或某些特定的后端方法。比如,通过设置EVENT_NOKQUEUE环境变量来关闭kqueue后端方法。

1.event_base的创建

(1)event_base_new()

注:此方法创建的是一个拥有默认配置的event_base对象,并且它会根据你的操作系统从可用的“后端方法”中选择一个最高效的方法。

(2)event_base_new_with_config()

event_base_new()创建的event_base对象使用的是默认的设置,如果你想要在创建event_base对象的时候就指定一些配置的话,需要使用下面这个函数:

其中,参数cfg对象的创建和销毁使用如下函数:

通过event_config_new()函数创建了event_config对象之后,就可以做一些配置操作了。比如:

其中,event_method_feature包含以下字段:

event_base_config_flag包含以下字段:

对此,有如下的一般使用方法:

2.event_base的销毁

使用完event_base对象之后,使用如下函数进行资源释放:

需要注意的一点是:该函数只会释放event_base对象本身,并不会去释放当前与event_base关联的任何事件以及事件套接字等等。

3.检查event_base

(1)event_get_supported_methods()

获取Libevent支持的方法的名字数组:

比如,有如下使用方法:

(2)event_base_get_method()

获取event_base正在使用的后端方法:

类似的函数还有event_base_get_features(),该函数返回event_base支持的特性的位掩码。一般使用方法如下:

4.event_base优先级

(1)设置优先级个数

Libevent在默认情况下只支持单个优先级。通过调用下面这个函数,可以设置event_base支持优先级的数量。

注:优先级范围为0到n_priorities-1。数字越小,优先级越高;数字越大,优先级越低。

(2)获取优先级个数

如果想要获取当前event_base支持的优先级个数,使用该函数:

5.event_base与fork

在调用fork()生成子进程后,如果你想要在子进程中继续使用event_base对象,你需要重新初始化它:

一般使用方法如下:

6.其他

如果将一个event_base对象开启锁,那么在多线程中访问它将是安全的。但是需要注意的是,目前event_base的循环只能在单个线程中进行。如果你想要对IO进行多线程轮询的话,则需要为每一个线程创建一个event_base对象。

参考:
http://www.wangafu.net/~nickm/libevent-book/Ref2_eventbase.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注