class io_context
: public execution_context
execution_context是io_context的基类,表示函数对象执行的上下文。
execution_context代表函数对象执行的位置。
execution_context和services
(1) execution_context实现一个可拓展的,类型安全的,services多态集合,通过service type 索引。
(2) services 用于管理用于跨execution_context共享的资源。例如,timers可能的通过单个timer队列实现,该队列被保存在一个service中
通过模板函数use_service(), add_service(), has_service()访问exection_context对象的services
调用use_service<Service>(),类型参数Service用于选择service使得全部的成员变得可使用。 如果service在execution_context中不存在,则类型为Service的对象将被创建并且加入到exection_context中。通过has<service<Service>()检查exection_context是否实现对应的Service。
Service对象可以通过显示调用模板函数add_service<Service>()添加到exection_context中。如果Service已经存在则抛出service_already_exists异常。如果service的拥有者和exection_context参数不是相同的对象则抛出invalid_service_owner异常。
通过调用user_service<>()获取exection_context对象的service的引用,那么,在exection_context对象存在时都可用
全部service实现都以execution_context::service作为基类。 自定义services可以通过继承exection_context,并且,通过add_service()加入exection_context中。
exection_context作为具体的exection context types 的基类,例如io_context是继承类型的示例。
继承于exection_context的类在析构时,调用顺序必须为:
execution_context::shutdown()
execution_context::destory()
通过使用shared_ptr<>对象,析构顺序能够简化资源管理,共享指针对象关联的对象的生命周期关联到一个connection(或其他异步操作序列),共享指针对象关联的对象能够绑定到异步操作关联的handler:
(1) 当单个connection结束/全部关联的操作完成,对应的handler对象将被销毁,并且,全部的shared_ptr指向的对象被销毁
(2) 为了关闭整个程序,io_context对象的stop()函数被调用用于越快越好地终止任意run(),通过io_context的析构函数调用shutdown()和destroy()销毁全部阻塞的handlers和触发全部shared_ptr关联的对象销毁
来源:oschina
链接:https://my.oschina.net/u/4285053/blog/3221457