




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 C 语言并发编程的一种思维方式 现今 单台机器拥有多个独立的计算单元已经太常见了 这点在服务器的处理器上表现尤 为明显 据 AMD 的一张 2012 2013 服务器路线图显示 服务器处理器的核心数将在 2013 年达到 20 颗之多 合理的利用 CPU 资源已是一个不得不考虑的问题 不少 C 程序员依然使用着多线程模型 但是对多线程的掌控并不是一件容易的事情 开发中容易 出错 难以调试 有些开发者为了避免多线程带来的复杂度而弃用多线程 有些开发者则 另投其他语言阵营 例如 Erlang 其实我们还有其他的选择 Theron 就是其中之一 什么是 Theron Theron 是一个用于并发编程的 C 库 通过 Theron 我们可以避免多线程开发中各种 痛处 例如 共享内存 线程同步 Theron 通过 Actor 模型向我们展示了另一种思维 什么是 Actor 模型 Erlang 因为其优秀的并发特性而被大家所关注 而其并发特性的关键之一就是在于其采用 了 Actor 模型 与 Actor 模型相对应的模型则是我们在面向对象编程中使用的 Object 模型 Object 模型中宣扬 一切皆为 Object 对象 而 Actor 模型则认为一切皆为 Actor Actor 模型中 Actor 之间通过消息相互通信 这是其和 Object 模型的一个显着的 区别 换而言之 Actor 模型使用消息传递机制来代替了 Object 模型中的成员方法调用 这样做意义重大 因为相对于成员方法的调用来说 消息的发送是非阻塞的 它无需等待 被调用方法执行完成就可以返回 下图显示了此种区别 2 A a 调用了 objB b 此时 A a 必须等待 B b 的返回才能继续执行 在 Actor 模 型中 对应的做法是 Actor A 向 Actor B 发送消息并立即返回 这时候 Actor A 可以继 续执行下去 与此同时 Actor B 收到消息被唤醒并和 Actor A 并行执行下去 Theron 中的每个 Actor 都会绑定一个唯一的地址 通过 Actor 的地址就可以向其发 送消息了 每个 Actor 都有一个消息队列 从编码者的角度看来 每实例化一个 Actor 都创建了一个和 Actor 相关的 线程 非系统级的线程 每个 Actor 总是被单线程的执行 总结来说 Theron 的并发特性的关键就在于 每个 Actor 在属于自己的单个 线程 中执行 而多个 Actor 并发执行 Hello Theron include include include 定义一个消息类型 在 Theron 中 任何类型都可以作为一个消息类型 唯一的一个约束是消息类型的变量能够被拷贝的 消息按值发送 而非发送它们的地址 struct StringMessage char m string 64 用户定义的 Actor 总需要继承于 Theron Actor 每个 Actor 和应用程序的其他部分通信的唯一途径就是通过消息 class Actor public Theron Actor public inline Actor 3 注册消息的处理函数 RegisterHandler this private 消息处理函数的第一个参数指定了处理的消息的类型 inline void Handler const StringMessage if Send message from printf Failed to send message to address dn from AsInteger int main Framework 对象用于管理 Actors Theron Framework framework 通过 Framework 构建一个 Actor 实例并持有其引用 Actor 的引用类似于 Java C 等语言中的引用的概念 Theron ActorRef 采用引用计数的方式实现 类似于 boost shared ptr Theron ActorRef simpleActor framework CreateActor 创建一个 Receiver 用于接收 Actor 发送的消息 用于在非 Actor 代码中 例如 main 函数中 与 Actor 通信 Theron Receiver receiver 构建消息 StringMessage message strcpy message m string Hello Theron 4 通过 Actor 的地址 我们就可以向 Actor 发送消息了 if framework Send message receiver GetAddress simpleActor GetAddress printf Failed to send message n 等到 Actor 发送消息 避免被关闭主线程 receiver Wait return 0 这个范例比较简单 通过 Actor 输出了 Hello Theron 需要额外说明的一点是消息在 Actor 之间发送时会被拷贝 接收到消息的 Actor 只是引用到被发送消息的一份拷贝 这 么做的目的在于避免引入共享内存 同步等问题 Theron 的消息处理 前面谈到过 每 个 Actor 都工作在一个属于自己的 线程 上 我们通过一个例子来认识这一点 我们修改 上面例子中的 Actor Handler 成员方法 inline void Handler const StringMessage ifdef MSC VER Sleep 1000 else sleep 1 endif 此 Handler 会不断的打印 message 并且带上当前 Actor 的地址信息 在 main 函 数中 我们构建两个 Actor 实例并通过消息唤醒它们 再观察输出结果 Hello Theron 1 Hello Theron 2 5 Hello Theron 2 Hello Theron 1 Hello Theron 2 Hello Theron 1 Hello Theron 2 Hello Theron 1 这和我们预期的一样 两个 Actor 实例在不同的线程下工作 实际上 Framework 创建的时候会创建系统级的线程 默认情况下会创建两个 可以通过 Theron Framework 构造函数的参数决定创建线程的数量 它们构成一个线程池 我们 可以根据实际的 CPU 核心数来决定创建线程的数量 以确保 CPU 被充分利用 线程池 的线程是以何种方式进行调度的 如下图 接收到消息的 Actor 会被放置于一个线程安全的 Work 队列中 此队列中的 Actor 会被唤醒的工作线程取出 并进行消息的处理 这个过程中有两个需要注意的地方 对于某个 Actor 我们可以为某个消息类型注册多个消息处理函数 那么此消息类型对 应的多个消息处理函数会按照注册的顺序被串行执行下去 6 线程按顺序处理 Actor 收到的消息 一个消息未处理完成不会处理消息队列中的下一 个消息 我们可以想象 如果存在三个 Actor 其中两个 Actor 的消息处理函数中存在死循 环 例如上例中的 while true 那么它们一旦执行就会霸占两条线程 若线程池中没有多 余线程 那么另一个 Actor 将被 饿死 永远得不到执行 我们可以在设计上避免这种 Actor 的出现 当然也可以适当的调整线程池的大小来解决此问题 Theron 中 线程池中 线程的数量是可以动态控制的 线程利用率也可以测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电子产品行业可穿戴设备市场前景报告
- 巴彦淖尔市2025内蒙古巴彦淖尔市统计局所属事业单位高层次急需紧缺人才引进测评笔试历年参考题库附带答案详解
- 2025年工业互联网技术在制造业中的发展前景研究报告
- 宜宾市2025上半年四川宜宾市屏山县事业单位考核招聘28人笔试历年参考题库附带答案详解
- 临夏市2025甘肃省临夏市教育系统引进人才28人笔试历年参考题库附带答案详解
- 2025福建移动春季校园招聘若干人笔试参考题库附带答案详解
- 2025江苏南通中国移动全资子公司中移铁通南通公司如东分公司招聘笔试参考题库附带答案详解
- 2025年燕舞集团有限公司公开招聘9人笔试参考题库附带答案详解
- 2025年山东省环保发展集团绿能有限公司及权属企业招聘(社招校招)(75人)笔试参考题库附带答案详解
- 2025山西忻州神达能源集团有限公司招录集团所属单位各岗位人员10人笔试参考题库附带答案详解
- 咖啡基础培训课件
- 人才服务合同书
- 2025年工会财务大赛理论题库(附答案)
- 2025-2026学年统编版八年级上册道德与法治教学计划含教学进度表
- 矿井顶板事故防治课件
- 2025年中国电力投资集团校园招聘笔试题型分析及备考策略
- 抗生素课件教学课件
- 销售法律知识培训
- 中国慢性胃炎诊治指南(2022年)解读
- 糖尿病低血糖症诊疗指南
- 直升机发动机油封课件
评论
0/150
提交评论