浅析boost asio中的event loop (4)

本文主要探讨boost asio在Linux环境下如何利用epoll_reactor进行事件循环。通过分析(descriptor_state)和run的实现,阐述异步操作如何缓存到op_queue,并讨论epoll相对于select的优势。
摘要由CSDN通过智能技术生成

我们再来分析一下epoll_reactor

 

从前文我们知道boost asio会根据编译选项来选择reactor,对于Linux来说一般都是epoll,而对于2.4的内核就是select_reactor了,和Java里通过Interface来实现这种“策略模式”不同,C++一般是通过模版来实现,这种方式的好处就是不需要像Java中的Interface那么严格,可以有不同的返回类型或者不同的参数类型,这些接口可以是implicit的。

这些类都提供了这些接口:

init_task:初始化reactor
shutdown_service:关闭reactor
register_descriptor:注册文件fd
close_descriptor:关闭文件fd
start_op:开始执行op
cancel_ops:取消socket关联的所有op
add_timer_queue:
remove_timer_queue:
schedule_timer:
run:执行一次event loop

先来看看descriptor_state,descriptor_state是epoll中和一个socket关联,为每类操作都分配了一个op_queue,用户调用的异步操作都会先缓存在这些队列中,这点在后续的blog会有专门的分析

// connect和write在epoll中都是一样的可写状态
enum { read_op = 0, write_op = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值