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 ...
随机推荐
- pytest1-Installation and Getting Started
pytest是python的一种单元测试框架(非自带,需要安装),与python自带的unitest测试框架相比,使用起来更加简洁.效率更高.总之,一句话,pytest优于unitest. 1.安装p ...
- maven 打包 spring boot 生成docker 镜像
1.所使用材料 ,spring boot 项目 基于maven ,maven 工具, docker工具 ps:为啥使用 docker 公司微服务需要启动太多,有两个优点吧! 1.方便管理,2.减少服务 ...
- Mongodb 常见的查询语句及与 mysql 对比
db.users.find()select * from users db.users.find({"age" : 27})select * from users where ag ...
- .NET Core3.0 日志 logging
多年的经验,日志记录是软件开发的重要组成部分.没有日志记录机制的系统不是完善的系统.在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用. ...
- JavaWeb 如何防止表单重复提交 - 使用Token,令牌
JavaWeb 如何防止表单重复提交 - 使用Token,令牌 说到重复提交 ,应该想到两种场景:1. 在下单,或者支付 这种情况 那么不允许 刷新,不允许后退再点击提交(后退之后提交会失败,修改了 ...
- nginx配置中location匹配规则详解
一.概述 nginx官方文档给出location语法如下: 1 location [=|~|~*|^~] uri { … } 其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式. ...
- Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导
Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导 Veins(车载通信仿真框架)入门教程(三)——多跳路由实现指导 必要的message类实现 从下面开始是在veins/src/vei ...
- WordCount的实现和测试
WordCount 一.开头 (1)合作者:201631107110,201631083416 (2)代码地址:https://gitee.com/zhaoxiaoqin/WordCount.git ...
- vue表单和组件使用
表单: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- Mycat分布式数据库架构解决方案--配置defaultAccount属性报错解决方案
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文章 ...