Libevent:event

 我来答
会哭的礼物17
2022-06-22 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6227
采纳率:100%
帮助的人:34.9万
展开全部

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 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层... 点击进入详情页
本回答由威孚半导体技术提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式