libevent源码学习-----Reactor模型

libevent内部采用了reactor模型
所谓reactor模型,其实就是一套事件注册机制,用来解决单线程的阻塞问题。reactor核心思想是将事件和相应事件发生时想要调用的函数都记录下来,在事件驱动循环开始后进行统一监测,当某个事件发生,会直接调用相应事件的处理函数。
比如说有事件event1,event2,event3。相应事件发生时想要调用的回调函数是cb1,cb2,cb3。然而如果是顺序判断每个事件的发生时,会是这样

阻塞等待event1发生
执行cb1
阻塞等待event2发生
执行cb2
阻塞等待event3发生
执行cb3

然而如果在等待event1发生时event2发生了,因为此时event1仍然没有发生,所以会阻塞在等待event1的位置,导致event2发生了却没有调用event2的回调函数

reactor正是解决这种问题的模型,先将event1和cb1,event2和cb2,event3和cb3注册到事件驱动上,reactor负责以非阻塞的方式等待注册事件的发生,当某(些)个事件发生时,reactor主动调用相应的回调函数

注册event1和cb1到reactor中
注册event2和cb2到reactor中
注册event3和cb3到reactor中

reactor以阻塞的方式判断有什么事件发生,比如调用io复用函数
对检测到发生的事件调用对应的回调函数

与Reactor相对应的有一个Proactor模型,它才是真正意义上的异步,而Reactor只能称为同步
二者不同之处在于

  • Reactor需要由应用程序本身调用回调函数,在这个时候仅仅是一个一个回调函数的调用,即同步调用,如果某个回调函数执行时间过长,会影响后面的函数调用
  • Proactor不需要应用程序调用,而是交给内核执行回调函数,当内核执行完后将结果返回给应用程序,所以不会出现Reactor的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值