Chinaunix首页 | 论坛 | 博客
  • 博客访问: 383087
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-24 16:18
个人简介

为啥不能追求自己的爱好一辈子呢

文章分类

全部博文(80)

文章存档

2017年(1)

2015年(2)

2014年(18)

2013年(59)

分类: LINUX

2013-10-11 18:27:09

综述:

   在你使用libevent的方法之前,你需要创建一个或者多个event_base结构体,每个event_base容纳着一系列你想要监控的事件。等待事件的发生。
   如果你在初始化的时候使用了锁的机制,那event_base就是多线程安全的,如果你想要每个线程都等待某些事件的发生,你就需要每个线程拥有一个event_base。
   在event_base的背后都有一个通过系统的借口获得事件通知的方法,他可以通过
  • select

  • poll

  • epoll

  • kqueue

  • devpoll

  • evport

  • win32

  来获取系统的消息。你可以禁止使用某些方式。例如你想禁用kqueue,你可以设置EVENT_NOKQUEUE环境变量。event_config_avoid_method()函数也可以用来禁用关的功能。

创建方式:

      struct event_base* event_base_new();
            该函数检查环境变量,并且生成一个event_base的对象,他定义在文件中。当你调用某些方法的时候,他会使用最快的接口。
     
     如果你需要对他进行额外的配置还有几个接口可以使用
:
     struct event_config *event_config_new();
    struct evnet_base * event_base_new_with_config(const struct event_config* cfg);
    void event_config_free(struct event_config* cfg);
         当你通过event_config生成event_new后,你就可以释放event_config了。
    
     设置event_config的api如下

    int event_config_avoid_method(struct event_config *cfg, const char *method);
       该函数让event_base避免选择一种底层的事件通知方式,例如method=“select”
    
   设置event_config结构的接口如下:
   
enum
event_method_feature {
          EV_FEATURE_ET = 0x01,              //必须支持边界触发模式
          EV_FEATURE_O1 = 0x02,              //增加事件和删除事件,复杂度必须为O(1)
          EV_FEATURE_FDS = 0x04, };        //必须支持多种文件描述符,不只是socket

      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_*系列的环境变量
        EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,        //windows,使用IOCP,完成端口
        EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
        EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,     //使用epoll changelist,慎重使用
        EVENT_BASE_FLAG_PRECISE_TIMER = 0x20 };                 

    
int event_config_set_flag(struct event_config *cfg, enum event_base_config_flag flag);

   还有一系列的额外的api:

      int event_config_set_num_cpus_hint(struct event_config *cfg, int cpus);
   int event_config_set_max_dispatch_interval(struct event_config *cfg, const struct timeval *max_interval, int max_callbacks, int      
   fmin_priority);
  还有两个函数是负责获取event_base的可以使用的底层方法:

  const
char **event_get_supported_methods(void);

    获取正在使用的底层方法

    const char *event_base_get_method(const struct event_base *base);
    enum event_method_feature event_base_get_features(const struct event_base *base);

    删除even_base:

  void event_base_free(struct event_base *base);

     设置优先级的:

   int event_base_priority_init(struct event_base *base, int n_priorities);

   int event_base_get_npriorities(struct event_base *base);//获取支持的优先级,例如返回值3,表示0,1,2,3

   如果在你的程序中使用了fork,你想要继续使用event_base,你需要调用: 
   int
event_reinit(struct event_base *base);


 例子:

   

点击(此处)折叠或打开

  1. struct event_config *cfg;
  2. struct event_base *base;
  3. int i;

  4. /* 我想使我的程序一个使用边界触发,一个不使用 */
  5. for (i=0; i<2; ++i) {
  6.     cfg = event_config_new();

  7.     /*不想使用select */
  8.     event_config_avoid_method(cfg, "select");

  9.     if (i == 0)
  10.         event_config_require_features(cfg, EV_FEATURE_ET);

  11.     base = event_base_new_with_config(cfg);
  12.     event_config_free(cfg);
  13.     if (base)
  14.         break;

  15.     /* 如果成功会到达这里. */
  16. }



  

阅读(1296) | 评论(0) | 转发(0) |
6

上一篇:libevent简介

下一篇:让event_base工作起来

给主人留下些什么吧!~~