boost.asio新框架的设计概念总结
1.66版本,boost.asio库重新设计了框架,目前最新版为1.71。读了几天代码后,对框架中相关概念总结。因为是泛型编程的库,所以分析的概念层的设计。
可通过boost官方文档,strand的1.65和1.66两版本文档比较,查证ts和io_context, executor首次出现在1.66。
新框架有几个核心概念,Context,Scheduler,Service,Executor,Strand。
Context:
1, asio所有功能都必需在一个Context 里调度执行
2, 每个Context 都有一个Service 注册表,管理Service
3, 每个Context 下的Service 都是唯一的
4, 每个Context 都有一个Scheduler
5, Context 必须通过在线程运行poll()或run()进入调度消费Scheduler 执行队列并执行任务
6, io_context是一种对io操作优先的优化Context,将io事件复路分集方法做成内嵌任务
7, io_context的win版本对Schdeluer 进行了优化,聚合了iocp。
8, 可以在多线程上同时运行poll()或run(),并且线程安全
Scheduler:
1, 首先是一个Context 的一个服务
2, 有一条op_queue执行队列
3, 所有Service 的调度都最终依赖Scheduler 调度
4, Scheduler 的dispatch()方法将任务调度到执行队列
Service:
1, 为某种功能提供调度以及功能服务
2, 最终依赖所在的 Context 的 Scheduler 调度服务
3, 每种 Service 都有一个service_impl类,并为这个类提供服务
Executor:
1, 相当于ios中的可并行的dispatch_queue
2, 相当于一个 Context 的服务,或者对 Context 的 Execution 行为的委托
3, 最终依赖所在的Context的Scheduler调度服务
Strand:
1, 相当于ios中的串行化的dispatch_queue
2, 分两种服务,绑定本io Context 以及可以指定Executor (即不同类型的Context )
3, 每个Strand 有独立的执行队列
4, Strand 本身作为一个任务,必须在Scheduler 进行调度分派。
5, 同一个Strand 同时只能在一条线程上分派执行队列
6, 当多线程同时对Strand 分派时,其它线程只能将任务缓冲到等待队列
7, 利用本身强制串行化的特性,可代替同步锁,保护变量和代码,减少线程切换
这些概念一般都会出现在模板参数。希望本文可以帮助你去阅读新框架asio的代码。欢迎浏览http://www.cnblogs.com/bbqzsl的其他文章。
boost.asio新框架的设计概念总结的更多相关文章
- Boost.Asio 网络编程([译]Boost.Asio基本原理)
转自:https://m.w3cschool.cn/nlzbw/nlzbw-3vs825ya.html Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将 ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
- Boost.Asio c++ 网络编程翻译(14)
保持活动 假如,你须要做以下的操作: io_service service; ip::tcp::socket sock(service); char buff[512]; ... read(sock, ...
- boost::asio 学习
安装 下载-解压 指定安装目录 ./bootstrap.sh --prefix=/usr/local/boost_1_68_0 查看所有必须要编译才能使用的库 ./b2 --show-librarie ...
- 谈谈Boost网络编程(2)—— 新系统的设计
写文章之前.我们一般会想要採用何种方式,是"开门见山",还是"疑问式开头".写代码也有些类似.在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用.在 ...
- 概念理解:boost::asio::io_service
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
- boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)
* Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protoc ...
- socket通信框架——boost asio
boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...
- boost asio 一个聊天的基本框架
示例代码 #include "Util.h" #include "MyAsio.h" #include "TcpConnectionManager.h ...
随机推荐
- tinyxml2
网上下载tinyxml2:tinyxml2.h和tinyxml2.cpp 加载xml XMLDocument doc; doc.LoadFile("test.xml"); ...
- 研究了3天,终于将 Shader 移植到 Cocos Creator 2.2.0 上了!
预览 扫光特效-Fluxay2 马赛克像素特效-Mosaic 过渡效果-Transfer Shawn 花了3天时间,研究了Cocos Creator 2.2.0 的 Effect 语法,终于在1024 ...
- Windows 批量修改文件后缀名
利用ren 文件名替换命令 for循环去批处理 @echo off for %%m in (*) do ( if not "%%m"=="temp.bat"( ...
- javascript学习 first-day
1.javascript是一种客户端语言,设计它的目的是在用户的机器上而不是服务器上执行任务. 1.1 javascript不允许写服务器机器上的语言: 1.2 Javascript不能关闭不是由 ...
- 百万年薪python之路 -- 内置函数
内置对象(68个)第一部分 内置函数一共68个 一些可以重要性不高的内置函数,只需了解即可 all() any() bytes() callable() chr() ord() complex() d ...
- kmp算法,求重复字符串
public class Demo { public static void main(String[] args) { String s1 = "ADBCFHABESCACDABCDABC ...
- Fiddler抓包工具的基本操作
Fiddler ——位于客户端和服务器端的HTTP代理 代理:客户端所有请求都先经过fiddler,然后转发到相应服务器 服务器端所有相应都先经过fiddler,然后发送到客户端 1. 常用的HTTP ...
- PHP的陷阱
PHP的陷阱 写代码的时候有个疑惑,那就是数组下标不存在的时候就会挂掉Undefined Index XXXX,这是对的,但是有时候他就不报错,这又是矛盾的. 请看下面的例子: $json_raw = ...
- 什么是Viewport
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机 ...
- swift ARC中的strong、weak、unowned
Swift 用自动引用计数ARC(Automatic Reference Counting)方式来跟踪和管理app的内存使用.这使得内存管理成为swift内部的机制,不需要认为考虑.ARC会自动释放那 ...