libevent学习笔记 - 2 event_base

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

(待更新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Libevent是一个事件驱动的网络编程框架,而event.h是其核心头文件之一。该头文件定义了事件处理相关的结构体、函数和宏等内容。 下面是event.h中常用的一些定义和函数: ### 1.事件回调函数 ```c typedef void (*event_callback_fn)(evutil_socket_t fd, short events, void *arg); ``` 该类型定义了事件回调函数的原型,其中fd是事件所在的文件描述符,events是事件类型,arg是用户传入的参数。 ### 2.事件结构体 ```c struct event { event_callback_fn ev_callback; // 事件回调函数 int ev_fd; // 事件所在的文件描述符 short ev_events; // 事件类型 short ev_res; // 事件结果 struct event_base *ev_base; // 事件所属的event_base void *ev_arg; // 用户传入的参数 }; ``` 该结构体表示一个事件,其中ev_callback是事件回调函数,ev_fd是事件所在的文件描述符,ev_events是事件类型,ev_res是事件结果,ev_base是事件所属的event_base,ev_arg是用户传入的参数。 ### 3.事件类型 ```c #define EV_TIMEOUT 0x01 #define EV_READ 0x02 #define EV_WRITE 0x04 #define EV_SIGNAL 0x08 #define EV_PERSIST 0x10 #define EV_ET 0x20 ``` 该宏定义了事件类型,分别为超时事件、读事件、写事件、信号事件、持续事件和边缘触发事件。 ### 4.事件处理函数 ```c struct event_base *event_base_new(void); int event_base_dispatch(struct event_base *base); int event_base_loopexit(struct event_base *base, const struct timeval *tv); void event_base_free(struct event_base *base); ``` 这些函数用于创建event_base、处理事件、退出事件循环和释放event_base等操作。 以上是event.h中的一些常用内容,更多细节可以查看源码和官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值