gpt4 book ai didi

c++ - 调用 spawn_typed(...) 后如何访问新创建的类型 T 实例? (C++ Actor 框架)

转载 作者:行者123 更新时间:2023-11-30 02:35:14 24 4
gpt4 key购买 nike

在下面的示例中,生成的 actor 是 a_type 类型,它基于 typed_actor 模板。如何从 a_type 转换为类 A 的实例?

using a_type = typed_actor<replies_to<int>::with<void>>;

class A : public a_type::base
{
protected:
behavior_type make_behavior() override
{
return
{
[this](int value)
{
aout(this) << value << endl;
}
};
}
};

int main()
{
a_type spawned = spawn_typed<A>();
}

最佳答案

Actor 是异步实体,应被视为孤立的。虽然从技术上讲可以通过 actor_cast 获取原始指针并将其向下转换为实际类型,但我强烈建议不要这样做。在 CAF 中,只允许 actor 本身访问其状态。通过消息传递对 actor 进行解耦可以避免竞争条件设计。 Actor 不是直接调用成员,而是将消息发送到其他人的邮箱。这些邮箱是真正的并发主力,并且在没有锁的情况下实现。理想情况下,您生成的 actor 数量多于可用内核数量,因为 actor 应用程序通过将大问题拆分为许多小块来扩展,然后由许多 actor 同时解决。始终牢记阿姆达尔定律:您的应用程序不能比最长的顺序处理链更快。

CAF 中的 actor handles 还启用了网络透明性。一旦您开始在网络上分发您的应用程序,直接访问状态将根本行不通。此外,如果您使用 state_based actors,从 actor 外部访问状态是非常不安全,因为一旦 actor 调用 quit() ,状态就会被销毁 或被杀。

基本上有三种交换信息的方式:

  • 1:1 消息传递。大多数时候这是正确的解决方案。如果您需要一种特殊的方式与 Actor 沟通,您始终可以使用 scoped_actor
  • N:M 消息使用组传递。这是一种将更新从任意数量的生产者推送到任意数量的订阅者的简单方便的方法。 CAF 提供命名组和“临时”匿名组,以允许松散耦合的通信。
  • 共享交易(或同步)数据结构。如果您需要将参与者集成到现有应用程序中,或者需要将参与者与其他并发抽象相结合,那么在参与者和非参与者之间共享并发数据结构可能是一个有效的解决方案。在此模型中,您通过其构造函数将数据结构传递给参与者。但是,在这样做之前,您应该首先考虑使用纯消息传递和组(或参与者池)来组织并发工作人员的设计。这将您的应用程序限制在一台机器上,并占用了 future 开发的设计空间。

Actor 池还支持 1:N 通信(广播)、“分散/聚集”式工作流程等。

无论如何,破坏 CAF 提供的抽象通常不是一个好主意,您可能很快就会陷入“未定义行为领域”。最后一点,如果您发现自己对当前的设计陷入了死胡同,请随时在 CAF 邮件列表上开始讨论。

关于c++ - 调用 spawn_typed<T>(...) 后如何访问新创建的类型 T 实例? (C++ Actor 框架),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33833705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com