0

0

c++如何实现一个Actor模型 c++高并发编程模式【架构】

穿越時空

穿越時空

发布时间:2026-01-06 12:39:08

|

367人浏览过

|

来源于php中文网

原创

C++中可通过线程、队列、智能指针和std::variant实现Actor模型:Actor基类封装邮箱与消息循环,ActorRef提供安全引用,协程与线程池提升调度效率,强调类型安全、零拷贝与生命周期管控。

c++如何实现一个actor模型 c++高并发编程模式【架构】

在 C++ 中实现 Actor 模型,核心是模拟“每个 Actor 封装状态 + 独立执行上下文 + 仅通过异步消息通信”的范式。C++ 本身没有原生 Actor 支持(不像 Erlang 或 Akka),但可通过线程、队列、智能指针和类型安全的消息机制组合实现轻量、可控、高性能的 Actor 架构。

Actor 基类设计:封装状态与消息循环

每个 Actor 应继承统一基类,持有自己的消息队列、运行状态和调度逻辑。不直接暴露线程控制,而是由 Actor 自主消费消息:

  • 使用 std::queue<:unique_ptr>> 作为私有邮箱(mailbox),配合 std::mutex无锁队列(如 moodycamel::ConcurrentQueue)保证线程安全
  • 重载纯虚函数 onMessage(std::unique_ptr&&),由子类定义具体行为
  • 启动时调用 start() 启动独立工作线程(或绑定到线程池),持续 pop + dispatch,避免阻塞或忙等

消息类型系统:类型安全 + 零拷贝传递

避免运行时类型转换开销,推荐用 std::variant(C++17)或 boost::variant 定义封闭消息集:

  • 定义所有合法消息为结构体(如 struct Ping { int id; };, struct Shutdown {};),全部放入 using Message = std::variant;
  • 发送方用 actor->send(std::make_unique(42));,接收方用 std::visit([](auto&& msg) { ... }, msg); 分发
  • 禁止裸指针传递数据;大对象用 std::shared_ptr 共享,小对象直接值传递

Actor 生命周期与地址抽象(ActorRef)

不暴露原始指针,防止误调用或内存泄漏。引入 ActorRef 作为安全句柄:

快剪辑
快剪辑

国内⼀体化视频⽣产平台

下载

立即学习C++免费学习笔记(深入)”;

  • ActorRef 是轻量级、可拷贝的对象,内部持 std::weak_ptr + 原子计数器(用于引用跟踪)
  • 发送消息时先 lock() 获取 shared_ptr,若为空则丢弃或走死信队列(DeadLetter)
  • 支持跨线程传递 ActorRef,天然线程安全;销毁 Actor 时自动使所有 ActorRef 失效

调度与扩展性:协程 + 批处理优化(C++20+)

高并发下避免为每个 Actor 创建 OS 线程(成本高)。可用以下方式提升吞吐:

  • 采用 std::jthread + 工作窃取线程池(如 progschj/ThreadPool),Actor 注册到池中按需调度
  • C++20 协程版 Actor:将 onMessage 设计为协程函数,用 co_await 挂起 I/O(如网络读写),单线程支撑数千 Actor
  • 对高频短消息(如心跳),启用批量投递(sendBatch(std::vector)),减少锁竞争和虚函数调用频次

不复杂但容易忽略:Actor 不是万能银弹。C++ 实现时要警惕共享状态泄露、消息丢失边界(如进程崩溃)、以及调试难度上升。建议从单线程 Actor 系统起步,再逐步引入调度策略和监控(如消息延迟统计、邮箱积压告警)。真正落地时,常与 ZeroMQgRPC 结合做跨节点 Actor 通信,构成分布式 Actor 系统雏形。

相关专题

更多
erlang语言是什么
erlang语言是什么

erlang是一种并发、容错、分布式和动态类型的编程语言。它专门用于构建并发系统,并提供了一个轻量级进程模型来实现并发性。想了解更多erlang的相关内容,可以阅读本专题下面的文章。

389

2024.06.19

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

321

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

231

2023.10.07

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

528

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号