美文网首页程序员
Libevent(三)

Libevent(三)

作者: 食梦狸猫 | 来源:发表于2019-03-10 17:40 被阅读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。

    相关文章

      网友评论

        本文标题:Libevent(三)

        本文链接:https://www.haomeiwen.com/subject/pdtppqtx.html