Libevent:event
Libevent的最基本操作单元就是event,每个event表示一系列状况:
events都有相同的生命周期。一旦我们调用Libevent的函数去创建一个event而且绑定在一个event_base上,这就算是初始化了。这时我们可以添加在这个event上关注的要发生的事件,然后当事件发生后,此event就被激活,然后回调函数就会被执行。如果这个event设置为一直保持的状态,就会一直不停地关注事件。不然,只会关注一次。
event_new函数分配创建一个新的event绑定在base上,fd是我们关注读写事件的文件描述符,当event激活后,Libevent会调用提供的cb回调函数。出错的情况,会返回NULL;
销毁一个event,调用event_free()函数。
但要真正让Libevent开始关注事件,还需要event_add()函数
例子
对于这种情况,我们不能直接传一个指向event的指针给event_new,因为它此时还不存在。为了解决这种情况,我们可以用函数event_self_cbarg()
Libevent提供了一系列方便的宏
Libevent可以监听POSIX信号
也有一些对于信号事件方便的宏:
使用event_assign会造成难以诊断的错误,这时因为不同版本的Libevent里event结构的大小不同的原因。除非有了从堆上分配event有明显的性能不好的表现,我们应该尽量选择event_new()
我们也可以用event_assign去初始化栈分配和static栈初始化的events
永远不要在event已经绑定event_base后还在这个event上调用event_assign(),这会导致难以诊断的错误
当有多个event在同时激活,Libevent不会定义任何执行的顺序。我们可以通过定义优先级来达到
在调用event_add之前,调用函数
设置优先级。优先级范围是0和这个event_base里有的优先级数量。
当多个事件同时激活,Libevent先跑优先级高的,然后再继续循环去检查,当没有高优先级的时候才会去执行低优先级的。
Libevent提供了一系列函数
例子
但注意event_active会造成无限循环的使用,例如错误示范:
正确示范:
目前的Libevent使用二叉堆来存储时间事件,一般情况下的表现是O(lg n),但是当有很多相同时间事件时就会不同了。
例如,假如我们有一万个相同时间的时间事件,如果用双向链表队列只会用O(1)。
Libevent允许我们放这样的时间事件在链表队列里,其他的在二叉堆里,这样的话可以向Libevent寻求一个“相同时间”时间事件
2024-08-19 广告