我们再来分析一下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