boost::asio序列2:execution_context

梦想与她 提交于 2020-04-07 05:35:26
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关联的对象销毁

 

发布了183 篇原创文章 · 获赞 107 · 访问量 32万+
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!