C++并发编程框架Theron(1)——Actor模型介绍

2023-10-31

1 说在前面的话


这里写图片描述

  Theron是近些年发展起来的一个非常不错的C++并发编程框架,最近有详细阅读Theron的相关资料,发现它思想非常有条理,结构很明朗,非常适合项目开发。其实Theron国内研究还是非常少的,目前还没有看到什么公开项目使用该框架。但是这并不代表Theron不够优秀,一件新鲜事物要被众人接受自然需要经受一段时间的考验,所以我觉得自己应该尽一点微薄之力来当一名小小的传播者。当然,这点抬手之举相比较原作者的贡献简直不值得一提,看了所有Theron官网上开源的资料与源码,你就会感叹为何有这么详细的解释与示例,这不正是传说中注释比源代码还要长的开源库吗?!作者的耐心与努力值得我们每一个人竖起大拇指。
  此外,我也需要点明,你只要有一些C/C++经验直接阅读Theron官网的资料也一定能有很多收获。所以我后面所有的博文也仅仅是起一个翻译与自己见解介绍的作用,如果你有什么困惑的地方,那你不妨直接去Theron官网查找相应估计会有更好的理解。好了,废话不多说,让我们进入正题吧。
2 Theron是什么

这里写图片描述
图1 线程运行图

  近些年来,多线程开发与分布式开发受到越来越多人的关注。但是有过多线程开发与调试的人都知道,它的复杂性,调试难,易出错,内存共享,消息同步足以令每个开发者望而生畏,每写一条语句都想放弃查实其他开发方案。如图1所示,一个线程在多线程系统中运行的状态是要考虑很多方面的,现实开发中的复杂度更是超乎我们的想象。
  当然,共享内存的多线程开发中锁机制的引入,一定程度上能够保证线程同步,逻辑一致性。但是锁机制带来的资源消耗,效率低下问题,甚至有时候带来死锁等等一系列问题,不但没有得到想要的,而且还失去更多。
  图2前两行图展示了锁带来堵塞的问题,每个时刻只能允许一个线程工作(解锁的钥匙每次只有一个人能拿到),如同只能允许一个人蹲马桶一样,后面的人必须排队,所以效率可想而知是很低的。

这里写图片描述
图2 共享内存的多线程锁机制的比喻

  而图2第三行展示了Theron框架基于Actor模型的工作机制,它们通过消息通信来多线程工作。那Actor模型这种消息通信的工作机制到底是怎样的呢?它的优势在哪里?这一篇博文我将主要围绕Actor模型来叩开Theron框架的大门。
3 Actor模型
 3.1 介绍
  Theron框架是一个基于Actor模型的并发编程的C++库。而Actor模型使得Theron框架可以直接有效的创建并行分布式的应用。Theron框架提供了很多轻量便携的函数接口API,可以使用在Linux,Windows,Mac,ARM和Matlab环境。
  我们知道面向对象编程中使用的是Object模型,宣扬一切皆是对象,数据+行为=对象。而Actor模型则认为一切皆是Actor,Actor模型内部的状态由自己的行为维护,外部线程不能直接调用对象的行为,必须通过消息才能激发行为,也就是使用消息传递机制来代替Object模型的成员方法的调用,这样就保证Actor内部数据只能被自己修改。Actor模型=数据+行为+消息。
  但是C++是一种面向对象的语言,所以最终还是通过类来封装这种actor的机制,多线程的实现也是依靠内存共享的多线程机制设计的,只不过这些事情Theron源码已经帮我们完成了,我们直接使用它给出的类接口即可。Theron框架的多线程基础支持pthreads,Windows threads,boost::thread和C++11 threads四种传统类型来构建。多说一嘴,因为Theron框架在C++中说到底还是通过类封装实现Actor模型的,自然我们直接通过类对象调用类中方法数据。但是为了保证Theron框架生态的完整性,并且真正体现actor模型的优越性,我们还是不要如此为好。
  基于Object模型与Actor模型区别如图3所示。

这里写图片描述
(a)
这里写图片描述
(b)
图3 基于Object机制与基于Actor机制的比较

  从图中可以看到,类A的对象成员方法调用类B的对象成员方法需要经过A::call调用B::called方法,然后等待B::called方法执行完成并且返回响应,最后A::call继续上次调用的地方后面执行下去。而在Actor模型中,Actor A先发送消息给Actor B,然后即刻就返回继续执行下面的程序,而Actor B中收到消息被唤醒和Actor A并行执行下去。
  至此,Actor模型就可以看出这种消息机制的线程调用最大好处是非阻塞的,多个线程可以同时并发进行,无需等待被调用方法执行完成返回消息的响应。当然,看到此处大家或许跟我一样有一点困惑的地方,即万一我们后面的程序需要立即使用它返回的响应消息怎么办呢?其实这也算Actor存在的一点不足之处,需要我们在设计多线程前考虑你的程序到底适不适合这种机制,后面我们会再详细描述。
 3.2 Actor模型与共享内存模型不同点
  Actor这种独立并发的模型,与另一种共享内存模型完全相反。Actor之间通过消息传递方式进行合作,相互线程独立。随着多核时代和分布式系统的到来,共享内存模型其实不适合开发的。我们以酒店厨房做菜为例,如图4所示。

这里写图片描述
图4 Actor模型与共享内存模型的比喻图示

  ①、单线程编程,如图4(a)——犹如酒店只有一个厨师员工(一个线程),所有菜按点菜顺序与工序完成到底就行;
  ②、共享内存的多线程编程,如图4(b)——犹如酒店厨房是由洗菜工,刀工,掌勺,服务员等(每个人是一个线程),他们之间的确能通过合作能比一个厨师完成所有工序要快。我们需要考虑的是菜相当于是他们共享的资源,每次只能一个人在对其做处理,虽然有多道菜品,但是总会在穿插间存在等待。
  ③、Actor模型的多线程编程,如图4(c)——犹如酒店有多个厨师,分别是川菜师傅,鲁菜师傅,徽菜师傅等等,他们只要接到客人点菜的需求,整个人独自完成相对应菜系的工序,之间不管对方师傅要干嘛,如此多线程工作就大大增加了效率,并且不存在互相等待资源的情况,做好了自己发消息给服务员端菜即可。
  这样我们就可以看出Actor模型异步消息传递来触发程序并行执行,虽然不如直接调用来的直接而方便,但是它可以让大量消息真正意义上同步执行。同时消息让Actor之间解耦,消息发出去之后执行成功与否,耗时多少等等只要没有消息传递回来,一切都不在与发送方有任何关联。这样也保证了,我们不需要在共享环境中与同步锁,互斥体等常用基础多线程元素打交道。
 3.3 Actor模型的优缺点
  优点没什么再需要阐述的了,上面已经介绍的很详细,下面我们来看看它到底存在什么缺点,了解缺点对我们什么时候使用Actor模型有很大的规划作用。
  ①、每个Actor虽然是独立运行的,但是一旦同时接收到多个消息,一次也仅能处理一条消息,也就是按消息队列处理;
  ②、Actor间异步执行,通过消息的传递实现协同。所以一个Actor内部出现执行错误很可能造成整个程序的错误——比如一个或多个其他Actors可能一直等待它反馈的消息。所以我们一定需要好好的处理Actors的例外事件,并且有容错机制及时反馈错误信息给其他等待中的Actors;
  ③、Actor模型也存在死锁问题,也有可能遇到它们之间互相等待消息,所以可以使用超时设定的功能打破这个死锁情况;
  ④、从上面的阐述我们也能窥探一二,并不是所有的应用开发都很好适合Actor模型。当且仅当我们可以将问题分为多个小模块,并且它们各自是独立运行的,仅个别地方需要交流。如果多线程间需要频繁互动,存在交叉的环境,其实Actor模型的效率优势也就不复存在了,也就失去了其消息调用并行执行的必要性。

4 小结 
  这篇博文主要还是开个Theron框架的开头,主要介绍Theron框架的基石Actor模型,至于Theron框架的使用,函数接口,各种小示例我也会在今后抽空一一介绍。Actor并发模型实际上在很多语言上已经有使用,但是此次Theron框架将其封装到C++开发上,真正给我们C++程序开发带来了很大的便利。
  以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
  转载请注明出处:http://blog.csdn.net/FX677588/article/details/74359823


  参考文献:
  Theron框架官网http://www.theron-library.com/
  为什么Actor模型是高并发事务的终极解决方案?http://www.jdon.com/45728
  Actor模型的优缺点http://blog.chinaunix.net/uid-21712186-id-5000328.html
  详解Theron通过Actor模型解决C++并发编程的一种思维http://www.mahaixiang.cn/bcyy/954.html
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++并发编程框架Theron(1)——Actor模型介绍 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • Android内存泄漏原因及解决办法

    前言 面试中最常问的就是 你了解Android内存泄漏和Android内存溢出的原因吗 请简述一下 然后大多数的人都能说出原因及其例子和解决办法 但是实际项目中稍微不注意还是会导致内存泄漏 今天就来梳理一下那些是常见的内存泄漏写法和解决方法
  • 1.2小尺度衰落

    书接上文 谈完大尺度衰落 接下来谈谈传输过程中遇到的小尺度衰落 小尺度衰落是指短期内的衰落 具体指移动台移动小距离时 接收信号在短期内的波动 通常可由以下因素决定 多径传播 移动台的速度 周围物体的速度和信号传输带宽 1 2 1 小尺度衰落
  • 基于Flex (词法分析生成器) 构造词法分析器

    备忘录1 阿林的词法分析器答辩内容 前言 我们知道 通过一些词法分析生成器工具可以完成一个编译器的词法分析过程 比如说flex 我们可以通过它完成词法分析过程 但是它完成了这个过程并不会将整个词法分析的结果打印出来 因此我们需要使用正则表达
  • 小程序开发之WebSocket

    本文旨在记录如何实现小程序使用websocket接受 推送消息 websocket 是什么 websocket 服务器端和客户端 小程序如何和websocket建立连接 并实现消息推送 接受 websocket是什么 websocket是一
  • 一套干净的企业数据管理系统,拿来直接用

    项目介绍 此项目为企业数据管理系统的后端部分 前端部分请参考vue admin 项目实现了菜单管理 用户管理 角色管理和权限管理四个基础模块 前端菜单管理结合动态路由可自由添加菜单 结合Shiro权限管理实现了菜单和按钮的权限控制 前端采用
  • 简单的坦克

    作业题目 坦克对战游戏AI设计 作业要求 从商店下载游戏 Kawaii Tank 或 其他坦克模型 构建 AI 对战坦克 具体要求 使用 感知 思考 行为 模型 建模 AI 坦克 场景中要放置一些障碍阻挡对手视线 坦克需要放置一个矩阵包围盒
  • python画图渐变颜色的代号_matplotlib画渐变条形图

    官网上的就是这个图 我也看了代码 我也查了很多人写的代码 写的介绍 但是感觉都没有介绍到要点 都是在糊弄 今天本着从我自己的画图理念出发 写一写我的理解 我觉得画图主要的还是数据 数据不行 数据处理的不对 很有可能画不出来图 也导致出来的图
  • 关于安装Ubuntu18.04.5 版本系统无限循环卡在登录界面的解决方案

    关于安装Ubuntu18 04 5 版本系统无限循环卡在登录界面的解决方案 一 处于Ubuntu的登录界面 一 处于Ubuntu的登录界面 1 按Ctrl ALt F1进入命令行模式 输入用户名 密码 登录 2 卸载显卡驱动 sudo ap
  • xyz:function(){....} 相当于function xyz()

    xyz function 相当于function xyz
  • 没有服务器,unity 上传图片到oss服务器生成二维码

    一 前言 最近接了个外包 kinect换装 敬礼上传图片到服务器 返回链接二维码分享 自己没有服务器 问朋友朋友说可以用阿里的oss 直接上传展示 于是研究了下 然后分享下遇到的坑和制作过程 二 重点 这个里面我觉得有两点比较坑 源码中都已
  • HCIP 三层交换机

    一 实现VLAN间通信 在传统的交换机组网中 默认所有网络都处于同一个广播域 带来了许多问题 VLAN技术的提出 满足了二层组网隔离广播域需求 使得属于不同的VLAN间网络无法通信 但不同VLAN之间又存在着互相访问的需求 实际网络部署中一
  • spring-boot mybatis-plus 集成 + 代码生成器自定义controller 模板

    mybatis plus3 x 代码生成器请看以下链接 https blog csdn net qq 33842795 article details 103682488 maven依赖 spring boot 和 thymeleaf 结合
  • 2017-7-28 2-5 编写函数any(s1,s2), 将字符串s2中任一字符在字符串s1中第一次出现的位置作为返回结果,如果s1中不包含s2中的字符,则返回-1

    include
  • 优秀logo设计解析_优秀Logo设计!形/美/意的表现与运用

    文 李艳 作为一种浓缩的 独特的视觉语言 标志设计以其精炼图形 独具美感的视觉特征征和准确的诉求力 传播者特定的信息 标志设计是一门艺术性和实用性共存的设计艺术 它通常以简洁明了 富于张力的视觉效果进行传播 优秀的标志设计具有强烈的视觉冲击
  • 因果推断1

    相关性并不意味着因果关系 这个道理对大家都不陌生 我们如何科学 优雅地做一份关于 因果关系 数据分析呢 在这篇文章里 我们从因果推断对于数据分析的重要性出发 和大家分享一个因果推断的经典框架 一组因果推断的必备假设和一个因果推断的基础方法
  • log4net和SQL Server 2000

    log4net是在项目中很常用的一个日志工具 用来记录系统的各种信息和一些异常情况 log4net可以把信息以各种方式输出 关于log4net的介绍和使用 官方网站上有详细的说明 今天在使用log4net的时候遇到几个问题 想和大家讨论一下
  • 【TCP/IP】第二章 TCP/IP基础知识

    字面上的TCP IP指的是这两种协议 但是实际上一般指的是网际协议族 RCF TCP IP规范 RFC 简介 互联网 The Internet 网际网 Internet 互联网就是众多异构网络通过IX 网络交换中心 互联的一个巨型网络 物理
  • neo4j--Cypher语法练习(START、CREATE、MERGE)

    1 5 START 通过遗留索引 legacy index 查找开始点 START语句应当仅用于访问遗留的索引 所有其他的情况 都应使用MATCH代替 从Cyper3 2开始START语句已经被废弃 1 通过索引获取节点 当采用复杂的Luc
  • python sys.exit()、break、 exit()、quit()、os._exit()、return的区别

    1 sys exit 函数说明 标准的退出系统的方法 exit status 退出系统 并抛出SystemExit status 异常 如果不传递status或传递None 默认当做0处理 如果传递的status为数字 会被认为是系统的退出
  • C++并发编程框架Theron(1)——Actor模型介绍

    1 说在前面的话 Theron是近些年发展起来的一个非常不错的C 并发编程框架 最近有详细阅读Theron的相关资料 发现它思想非常有条理 结构很明朗 非常适合项目开发 其实Theron国内研究还是非常少的 目前还没有看到什么公开项目使用该