找回密码
 立即注册
首页 资源区 代码 libevent之event_base

libevent之event_base

郜庄静 4 天前
目录

  • 创建event_base

    • 设置默认event_base
    • 设置复杂的event_base
    • 检查event_base的后端方法
    • 解除分配event_base
    • 在event_base上设置优先级
    • 在 fork() 之后重新初始化event_base
    • 过时的event_base功能

  • 使用事件循环

    • 运行循环
    • 停止循环
    • 重新检查事件
    • 检查内部时间缓存
    • 转储event_base状态
    • 对event_base中的每个事件运行函数
    • 过时的事件循环函数


创建event_base

在使用任何有趣的 Libevent 函数之前,您需要分配 一种或多种event_base结构。每个event_base结构都包含一组 事件,并可以轮询以确定哪些事件处于活动状态。
如果event_base设置为使用锁,则可以安全地访问它 多个线程。但是,它的循环只能在单个线程中运行。如果 您希望有多个线程轮询 IO,您需要有一个 每个线程event_base。
提示[Libevent 的未来版本可能支持运行event_bases 跨多个线程的事件。每个event_base都有一个“方法”,或者一个后端,它用来确定哪个 活动已准备就绪。公认的方法有:

  • select
  • poll
  • epoll
  • kqueue
  • devpoll
  • evport
  • win32的
用户可以使用环境变量禁用特定的后端。如果您想关闭 kqueue 后端,可以设置 EVENT _ NOKQUEUE 环境变量,以此类推。如果希望从程序内部关闭后端,请参阅下面的 event _ config _ void _ method ()说明。
设置默认event_base

event_base_new() 函数分配并返回一个新的事件库 默认设置。它检查环境变量并返回 指向新event_base的指针。如果出现错误,则返回 NULL。
在方法之间进行选择时,它会选择操作系统最快的方法 支持。
接口
  1. struct event_base *event_base_new(void);
复制代码
对于大多数程序,这就是您所需要的。
event_base_new() 函数在  中声明。它首先 出现在 Libevent 1.4.3 中。
设置复杂的event_base

如果你想更好地控制你得到什么样的event_base,你需要 使用event_config。event_config是一种不透明的结构,可以容纳 有关您对event_base偏好的信息。当你想要一个 event_base,将event_config传递给 event_base_new_with_config()。
接口
  1. struct event_config *event_config_new(void);
  2. struct event_base *event_base_new_with_config(const struct event_config *cfg);
  3. void event_config_free(struct event_config *cfg);
复制代码
若要分配具有这些函数的event_base,请调用 event_config_new() 以分配新event_config。然后,您在 event_config告诉它您的需求。最后,你可以调用 event_base_new_with_config() 获取新event_base。完成后, 您可以使用 event_config_free() 释放event_config。
接口
  1. int event_config_avoid_method(struct event_config *cfg, const char *method);
  2. enum event_method_feature {
  3.     EV_FEATURE_ET = 0x01,
  4.     EV_FEATURE_O1 = 0x02,
  5.     EV_FEATURE_FDS = 0x04,
  6. };
  7. int event_config_require_features(struct event_config *cfg,
  8.                                   enum event_method_feature feature);
  9. enum event_base_config_flag {
  10.     EVENT_BASE_FLAG_NOLOCK = 0x01,
  11.     EVENT_BASE_FLAG_IGNORE_ENV = 0x02,
  12.     EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,
  13.     EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
  14.     EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,
  15.     EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
  16. };
  17. int event_config_set_flag(struct event_config *cfg,
  18.     enum event_base_config_flag flag);
复制代码
调用 event_config_avoid_method 告诉 Libevent 避免特定的 按名称提供后端。调用 event_config_require_feature() 告诉 Libevent 不使用任何不能提供所有功能的后端。 调用 event_config_set_flag() 告诉 Libevent 设置一个或多个 构造事件库时下面的运行时标志。
event_config_require_features的公认特征值为:

  • EV_FEATURE_ET
    需要支持边缘触发 IO 的后端方法。
  • EV_FEATURE_O1
    需要一种后端方法,其中添加或删除单个 事件,或让单个事件变为活动状态,是一个 O(1) 操作。
  • EV_FEATURE_FDS
    需要可以支持任意文件的后端方法 描述符类型,而不仅仅是套接字。
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 上,此标志使 Libevent 在启动时启用任何必要的 IOCP 调度逻辑,而不是 按需。
  • EVENT_BASE_FLAG_NO_CACHE_TIME
    而不是每隔检查一次当前时间 当事件循环准备好运行超时回调时,请在之后检查 每次超时回调。这可能会使用比您必须使用的更多的 CPU 有意的,所以要小心!
  • EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST
    告诉 Libevent,如果它决定 使用 epoll 后端,使用更快的基于“changelist”的 “changelist” 是安全的 后端。epoll-changelist 后端可以避免不必要的系统调用 同一 FD 在 调用后端的调度函数,但它也会触发内核错误 如果您向 Libevent 提供任何 fds 克隆,则会导致错误的结果 dup() 或其变体。如果使用后端,则此标志无效 除了 Epoll。您还可以通过以下方式打开 epoll-changelist 选项 设置EVENT_EPOLL_USE_CHANGELIST环境变量。
  • EVENT_BASE_FLAG_PRECISE_TIMER
    默认情况下,Libevent 尝试使用最快的可用计时机制 操作系统提供。如果时间较慢 提供更细粒度计时精度的机制,这 flag 告诉 Libevent 改用该计时机制。如果 操作系统没有提供这种更慢但更精确的机制, 此标志无效。
上述操作event_config的函数在成功时都返回 0, -1 失败时。
注意设置一个需要后端的event_config很容易,您的 操作系统不提供。例如,从 Libevent 2.0.1-alpha 开始,没有 O(1) 用于 Windows 的后端,而 Linux 上没有同时提供这两种功能的后端 EV_FEATURE_FDS和EV_FEATURE_O1。如果您已进行配置 Libevent 无法满足,event_base_new_with_config() 将返回 NULL。接口
  1. int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus)
复制代码
不过,此函数目前仅在使用 IOCP 时对 Windows 有用 将来它可能会对其他平台有用。调用它告诉 event_config,它产生的event_base应该尽量好好利用 多线程时给定数量的 CPU。请注意,这只是一个提示: 事件库最终使用的 CPU 可能比您选择的更多或更少。
接口
  1. int event_config_set_max_dispatch_interval(struct event_config *cfg,
  2.     const struct timeval *max_interval, int max_callbacks,
  3.     int min_priority);
复制代码
此函数通过限制低优先级的数量来防止优先级倒置 在检查更多高优先级事件之前,可以调用事件回调。 如果 max_interval 为非 null,则事件循环会检查每个事件之后的时间 回调,如果已通过,则重新扫描高优先级事件max_interval。 如果max_callbacks为非负数,则事件循环还会检查更多事件 调用max_callbacks回调后。这些规则适用于任何 min_priority 或更高的事件。
示例:首选边缘触发的后端
[code]struct event_config *cfg;struct event_base *base;int i;/* My program wants to use edge-triggered events if at all possible.  So   I'll try to get a base twice: Once insisting on edge-triggered IO, and   once not. */for (i=0; i
您需要登录后才可以回帖 登录 | 立即注册