0

0

c++如何实现一个简单的Actor模型_c++并发编程新思路

下次还敢

下次还敢

发布时间:2025-11-30 05:57:29

|

1101人浏览过

|

来源于php中文网

原创

Actor模型通过隔离状态、消息驱动和顺序处理实现并发,C++中可借助线程、消息队列和事件循环模拟,每个Actor拥有私有状态并通过异步消息通信,避免数据竞争,示例实现包含Actor基类、消息类型、邮箱和调度机制,支持计数器等简单应用,未来可优化为无锁队列、统一调度、协程集成等。

c++如何实现一个简单的actor模型_c++并发编程新思路

Actor模型是一种处理并发计算的编程范式,每个Actor是独立的执行单元,通过消息传递进行通信,避免共享状态带来的数据竞争问题。在C++中虽然没有原生支持Actor模型,但可以通过线程、消息队列和事件循环来实现一个简单的Actor系统。

基本设计思路

Actor的核心特点是:

  • 每个Actor拥有自己的私有状态,不与其他Actor共享
  • Actor之间只能通过异步消息通信
  • 每个Actor顺序处理接收到的消息,避免内部竞争

基于这些原则,我们可以用以下组件构建一个简易Actor系统:

  • Actor基类:提供消息处理接口和运行机制
  • 消息类型:定义可传递的数据结构
  • 邮箱(Mailbox):每个Actor的私有消息队列
  • 调度器:启动Actor并运行其事件循环

实现一个简单Actor类

#include 
#include 
#include 
#include 
#include 

// 消息基类
struct Message {
    virtual ~Message() = default;
};

// Actor可接收的消息处理器
using MessageHandler = std::function)>;

class Actor {
private:
    std::queue> mailbox_;
    std::mutex mtx_;
    bool running_ = false;
    MessageHandler handler_;

public:
    // 设置消息处理函数
    void setHandler(MessageHandler handler) {
        handler_ = std::move(handler);
    }

    // 发送消息到该Actor
    void send(std::shared_ptr msg) {
        {
            std::lock_guard lock(mtx_);
            mailbox_.push(msg);
        }
    }

    // 启动Actor事件循环
    void start() {
        if (running_ || !handler_) return;
        running_ = true;

        std::thread([this]() {
            while (running_) {
                std::shared_ptr msg = nullptr;
                {
                    std::lock_guard lock(mtx_);
                    if (!mailbox_.empty()) {
                        msg = mailbox_.front();
                        mailbox_.pop();
                    }
                }

                if (msg && handler_) {
                    handler_(msg);
                } else {
                    std::this_thread::yield(); // 没有消息时让出CPU
                }
            }
        }).detach(); // 分离线程,由系统自动回收
    }

    virtual ~Actor() = default;
};

使用示例:计数器Actor

下面是一个具体例子,实现一个接收加减指令的计数器Actor:

KAIZAN.ai
KAIZAN.ai

使用AI来改善客户服体验,提高忠诚度

下载

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

struct Increment : Message {};
struct Decrement : Message {};
struct Print : Message {};

#include 

int main() {
    Actor counter;

    int value = 0;

    counter.setHandler([&value](std::shared_ptr msg) {
        if (dynamic_cast(msg.get())) {
            ++value;
        } else if (dynamic_cast(msg.get())) {
            --value;
        } else if (dynamic_cast(msg.get())) {
            std::cout << "Current value: " << value << std::endl;
        }
    });

    counter.start();

    // 发送一些消息
    counter.send(std::make_shared());
    counter.send(std::make_shared());
    counter.send(std::make_shared());
    counter.send(std::make_shared());

    std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 等待输出

    return 0;
}

优化与扩展方向

上述实现是一个极简版本,实际使用中可以考虑以下改进:

  • 使用更高效的无锁队列替代std::queue + mutex
  • 引入Actor系统管理器,统一调度多个Actor
  • 支持消息响应机制(如返回结果给发送方)
  • 增加Actor生命周期管理(启动、停止、监控)
  • 结合C++20协程实现更轻量的并发模型

基本上就这些。这个简单实现展示了如何用C++模拟Actor模型的核心思想——隔离状态、消息驱动、顺序处理。虽然不如Erlang或Akka那样成熟,但在需要高并发又想避免锁复杂性的场景下,这种模式值得尝试。

相关专题

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

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

392

2024.06.19

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

534

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

14

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1018

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

63

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

407

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

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

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