Actor模型以独立角色为核心,通过异步消息通信避免锁与竞态;C++可用标准库模拟,需封装消息循环、线程安全队列及类型化路由,注重生命周期管理与消息边界控制。

Actor模型的核心思想
Actor模型把并发单元看作独立的“角色”(Actor),每个Actor拥有私有状态、一个收件箱(消息队列)和行为逻辑。它不共享内存,只通过异步消息通信——这天然规避了锁、竞态和死锁问题。C++没有原生Actor支持,但可用标准库组件(std::thread、std::queue、std::mutex、std::condition_variable)+ 消息传递机制模拟出轻量、可控的Actor行为。
定义基础Actor类
一个最小可行Actor需封装:消息循环、线程安全的消息入队、可注册的消息处理器。不依赖第三方库,用RAII管理生命周期:
- 用std::queue暂存消息,配合std::mutex和std::condition_variable实现线程安全的“等待-唤醒”循环
- 消息类型建议为std::variant或基类指针(带虚析构),支持多种消息体
- Actor启动后自动运行消息循环;析构时发送“退出”消息并join线程,确保干净关闭
实现消息发送与处理
Actor对外暴露send()方法,内部将消息压入队列并通知等待线程;处理逻辑由用户通过lambda或函数对象注册到特定消息类型上:
- 推荐用std::unordered_map<type_index, std::function<void(const Message&)>>做消息路由表,按typeid分发
- 消息循环中用wait_for带超时避免永久阻塞,便于响应停止信号
- 避免在消息处理器中执行耗时操作;如需长任务,应转发给专用Worker Actor,保持Actor响应性
简单示例:计数器Actor
定义Inc、Get、Stop三种消息,Actor维护私有int count_ = 0:
立即学习“C++免费学习笔记(深入)”;
- send(Inc{}) → 内部count_++,无返回
- send(Get{}) → 可通过回调或future返回当前值(注意:Actor本身不阻塞等待,需额外设计响应通道)
- send(Stop{}) → 触发循环退出,线程安全结束
这种设计让调用方完全不用关心锁或同步细节,只专注“发什么、谁来收”。
基本上就这些。不复杂但容易忽略的是生命周期管理和消息边界——比如消息拷贝成本、异常是否跨Actor传播、错误如何反馈。把这些点想清楚,一个够用的Actor骨架就立住了。











