博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libevent 笔记
阅读量:6412 次
发布时间:2019-06-23

本文共 1670 字,大约阅读时间需要 5 分钟。

struct event_base* event_init(void): 使用前必做的一件事,初始化事件API。

void event_set(struct event *ev, int fd, short event, void (*fn)(int, short, void *),void *arg);

初始化一个事件 ev.
fd 表示文件描述符。
event 关注的事件类型.可用‘|’类型组合。

  • EV_TIMEOUT-时间通知 
  • EV_SIGNAL-信号通知
  • EV_READ-可读通知
  • EV_WRITE-可写通知
  • EV_PERSIST-额外的标记,表示添加为永久事件,直到调用event_del

fn 函数指针,当事件到达时调用此函数。函数形式必须为void fn(int fd,short event,void *arg)

   其中,fd为当前处理的文件描述符号,event 事件类型,arg 参数指针。
   注:所有参数都将由事件系统自动传入。
arg 为参数指针,和fn中arg对应。

int event_add(struct event *ev, struct timeval *tv);

将事件ev添加入事件系统,等待超时为tv,如果没有时间限制,则设为NULL
成功返回0,否则返回-1且出错原因设置到erron

int event_del(struct event *ev); 从事件系统删除ev,如果事件不存在,或者已被执行,则无效

成功返回0,否则返回-1且出错原因设置到erron

int event_pending(struct event *ev, short event, struct timeval *tv):判断ev的event事件是否正在处理。

int event_initialized(struct event *ev):定义的一个宏,判断ev是否被初始化。

事件优先级:

int event_priority_init(int npriorities)

使用优先级机制首先应做的事,事件优先级初始化,必须在第一个event_dispatch前被调用。

int event_priority_set(struct event *ev, int priority):默认的都是中优先级,调用此函数显示设置ev优先级。

int event_dispatch(void):调用此函数,循环接受事件处理,仅仅出错时才返回。

线程安全相关:
libevent不能同一个event_base被多个线程使用,唯一的方法是每个线程拥有自己的event_base,通过pipe来进行通讯。
并因该如下做:
//初始化event
struct event_base* mEventBase = (struct event_base*)event_init();
//创建一个event(事件)
struct event* mEvAccept = (struct event*)malloc( sizeof( struct event ) );
event_set( mEvAccept, listenFD, EV_READ|EV_PERSIST,
     SP_EventCallback::onAccept, mAcceptArg );
//添加事件到mEventBase 
event_base_set( mEventBase, mEvAccept );
event_add( mEvAccept, NULL );

//处理mEventBase 中的事件,在处理的时候,只允许该处理线程对mEventBase 添加和删除event。

//因而设计时可以先创建一个pipe读事件并加入到mEventBase 。如有其他线程想把fd事件加入mEventBase时,只需向pipe写入建好的fd事件指针。
//然后交给pipe EV_READ的触发函数处理。
event_base_dispatch( mEventBase );

转载地址:http://svdra.baihongyu.com/

你可能感兴趣的文章
Selector中关于顺序的注意事项
查看>>
font-size: 62.5% 的含义
查看>>
小黑小波比.清空<div>标签内容
查看>>
Java中的ExceptionInInitializerError异常及解决方法
查看>>
Spring 注入bean时的初始化和销毁操作
查看>>
java线程同步原理(lock,synchronized)
查看>>
MyEclipse中使用Hql编辑器找不到Hibernate.cfg.xml文件解决方法
查看>>
yRadio以及其它
查看>>
第四节 对象和类
查看>>
闪迪(SanDisk)U盘防伪查询(官方网站)
查看>>
Android onMeasure方法介绍
查看>>
无锁数据结构
查看>>
MySQL的变量查看和设置
查看>>
android onNewIntent
查看>>
XML特殊符号
查看>>
kaptcha可配置项
查看>>
JavaMail邮箱验证用户注册
查看>>
系统时间——ntpd
查看>>
反射实现AOP动态代理模式(Spring AOP实现原理)
查看>>
Spring MVC 4.x + fastjson 1.2.7,封装的List<?>参数
查看>>