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 ...
随机推荐
- 点击任何位置隐藏所需隐藏的元素 (无BUG/jQuery版)
1>第一种分两步 1) :对document的click事件绑定事件处理程序,使其隐藏该div 2) :对div的click事件绑定事件处理程序,阻止事件冒泡,防止其冒泡到document,而调 ...
- 记录手动签名APK的过程
记录手动签名APK的过程 前两天更新了华为平台上的APK,被驳回,原因是新APK签名和老的APK不一致,老用户安装会失败,用命令行安装会报如下的错误: harlanc@harlancdeMacBook ...
- git jenkins 介绍
1.什么是持续集成?2.什么是持续交付?3.什么是持续部署?4.版本控制工具? git 1.git基本操作 2.git 分支 3.git 标签tag 4.gitlab git ...
- 百万年薪python之路 -- while循环
day02 1.while循环 -- while关键字 while 空格 条件 冒号 缩进 循环体 while 5>4: print("Hello World!") 数字中非 ...
- OptimalSolution(9)--其他问题(2)
一.有关阶乘的两个问题 二.最大的leftMax与rightMax之差的绝对值 三.路径数组变为统计数组 四.一种字符串和数字的对应关系 五.1到n中1出现的次数 六.数字的英文表达和中文表达 七.分 ...
- Java基础(三十一)JDBC(1)常用类和接口
1.Driver接口 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类.在加载某一驱动程序的Driver类时,它应该创建自己的实例并向java.sql.DriverMana ...
- SpringBoot接管SpringMvc
SpringBoot接管SpringMvc Spring Web MVC framework(通常简称为“Spring MVC”)是一个丰富的“model 视图控制器”web framework. S ...
- .NET webAPI中集成swagger
最近做的项目使用winform三层+webapi,对于webAPI路由文档管理一直觉得单独做一些管理比较麻烦,并且测试的时候项目内的代码测试运行起来也比较麻烦,所以在网上开始检索相关办法,发现热度比较 ...
- vue---Excel表格导出
一.安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev 二. ...
- ABAP中将Unicode字符串转换成中文的方法
以下为示例代码: DATA: LV_UNICODE TYPE STRING, "Unicode字符串 LV_CHINESE TYPE STRING. ...