C++如何实现一个Actor模型_利用C++构建高并发的Actor并发模型


Actor模型通过独立实体间的消息传递实现并发,每个Actor拥有私有状态、邮箱和行为逻辑,C++中可利用std::thread与线程安全队列模拟,如CounterActor示例所示,通过消息触发状态变更,避免共享内存,确保线程安全,虽无原生支持但能高效构建高并发系统。

Actor模型是一种处理并发计算的数学模型,每个Actor是独立的实体,通过消息传递进行通信,不共享状态。在C++中实现Actor模型,虽然不像Erlang或Akka那样原生支持,但借助现代C++(C++11及以上)的多线程和异步机制,完全可以构建出高效、安全的高并发Actor系统。

Actor模型核心思想

每个Actor拥有:

  • 独立的状态:不与其他Actor共享内存
  • 邮箱(Mailbox):接收其他Actor发送的消息
  • 行为逻辑:处理消息时执行的函数
  • 创建与通信能力:可创建新Actor,并向其他Actor发送消息

消息通过异步方式发送,Actor逐个处理邮箱中的消息,避免竞态条件。

使用std::thread与消息队列实现Actor

最基础的方式是为每个Actor分配一个线程或共享线程池,配合线程安全的消息队列。

// 简单的消息基类

#include
#include
#include
#include
#include
#include

struct Message {
    virtual ~Message() = default;
};

// 线程安全的消息队列
template
class ThreadSafeQueue {
private:
    mutable std::mutex mtx;
    std::queue data_queue;
public:
    void push(T msg) {
        std::lock_guard<:mutex> lock(mtx);
        data_queue.push(std::move(msg));
    }
    bool try_pop(T& value) {
        std::lock_guard<:mutex> lock(mtx);
        if (data_queue.empty()) return false;
        value = std::move(data_queue.front());
        data_queue.pop();
        return true;
    }
    bool empty() const {
        std::lock_guard<:mutex> lock(mtx);
        return data_queue.empty();
    }
};

定义Actor基类与行为

Actor运行在一个独立的上下文中,循环从邮箱取消息并处理。

class Actor {
public:
    using MessagePtr = std::shared_ptr;
    virtual ~Actor() { stop(); }

    void start() {
        running = true;
        thread = std::thread([this] { run(); });
    }

    void stop() {
        running = false;
        if (thread.joinable()) thread.join();
    }

    void send(MessagePtr msg) {
        mailbox.push(std::move(msg));
    }

protected:
    virtual void onMessage(const MessagePtr& msg) = 0;

private:
    void run() {
        while (running) {
            MessagePtr msg;
            if (mailbox.try_pop(msg)) {
                if (msg) onMessage(msg);
            } else {
                std::this_thread::sleep_for(std::chrono::nanoseconds(10));
            }
        }
    }

    ThreadSafeQueue mailbox;
    std::thread thread;
    std::atomic running{false};
};

实现具体Actor示例

比如一个计数Actor,接收增加指令并打印当前值。

struct IncrementMsg : Message {
    int delta;
    IncrementMsg(int d) : delta(d) {}
};

class CounterActor : public Actor {
private:
    int count = 0;

protected:
    void onMessage(const MessagePtr& msg) override {
        if (auto inc = dynamic_cast(msg.get())) {
            count += inc->delta;
            printf("Count is now: %d\n", count);
        }
    }
};

int main() {
    CounterActor counter;
    counter.start();

    counter.send(std::make_shared(1));
    counter.send(std::make_shared(2));
    counter.send(std::make_shared(3));

    std::this_thread::sleep_for(std::chrono::seconds(1)); // 等待处理
    return 0;
}

基本上就这些。这个简单框架展示了Actor模型的核心:封装状态、消息驱动、异步通信。实际生产中可进一步优化,如使用无锁队列、Actor池、调度器分离等。C++虽无原生Actor支持,但凭借其灵活性和性能优势,完全能构建出媲美Erlang的高并发Actor系统。


# c++  # ai  # 邮箱  # 无锁  # red  # erlang  # if  # count  # while  # 封装  # include  # printf  # const  # auto  # bool  # int  # void  # mutable  # 循环  # using  # class  # public  # private  # protected  # Struct  # 线程  # 多线程  # Thread  # 并发  # default  # this  # 异步  # 虽无  # 是一种  # 不像  # 所示  # 并向  # 不与  # 可利用  # 但能  # 发送消息 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++中的constexpr和const有什么区别?(编译期常量)  Windows系统时间服务错误_W32Time服务修复与同步教学  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  c++中如何对数组进行排序_c++数组排序算法汇总  Python解释执行模型_字节码流程说明【指导】  Win11怎么关闭防火墙通知_屏蔽Win11安全中心安全警告弹窗【技巧】  php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】  Win11怎么把图标拖到任务栏_Win11固定应用快捷方式指南【方法】  Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】  Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程  如何在Golang中配置代码格式化工具_使用gofmt和goimports  Python抽象类与接口设计_规范说明【指导】  Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  c++ std::future和std::promise c++线程间通信【教程】  Win11如何设置系统声音_Win11系统声音调整教程【攻略】  如何高效识别并拦截拼接式恶意域名 spam  C++如何编写函数模板?(泛型编程入门)  Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新  微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】  Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】  Win11局域网共享怎么设置 Win11文件夹网络共享教程【详解】  如何有效拦截拼接式恶意域名的垃圾信息  Go 语言标准库为何不提供泛型切片的 Contains 方法?  Win11怎么查看已连接wifi密码 Win11查已连wifi密码步骤【教程】  跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  Win10电脑怎么设置休眠快捷键_Windows10电源按钮功能定义  php内存溢出怎么排查_php内存限制调试与优化方法【说明】  Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值  Win11怎么修复系统文件_使用sfc命令修复Win11系统【技巧】  网站体验不好=浪费钱:如何提升-用户体验效果差  LINUX如何查看文件类型_Linux中file命令的识别与应用  php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】  c# 在高并发下使用反射发射(Reflection.Emit)的性能  Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】  WindowsUSB驱动安装异常怎么办_USB驱动重建与恢复教程  Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置  Python邮件系统自动化教程_批量发送解析与模板应用  PHP怎么接收URL中的锚点参数_获取#后面参数值的技巧【详解】  Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】  c++ unordered_map怎么用 c++哈希表用法【教程】  Win11怎么更改计算机名_Windows11系统信息重命名设备教程  Win11怎么关闭系统透明度_Windows11个性化颜色透明效果  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  Linux怎么禁止Root用户远程登录_Linux系统SSH加固与安全设置【教程】  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  Python配置文件操作教程_JSONINIYAML解析与应用实战 

 2025-12-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.