程序员

Libevent(三)

2019-03-10  本文已影响0人  食梦狸猫

创建一个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。

上一篇下一篇

猜你喜欢

热点阅读