【问题标题】:Initial state for the stateful_actor in CAFCAF 中 stateful_actor 的初始状态
【发布时间】:2019-04-08 06:33:08
【问题描述】:

我正在使用 CAF 为我最后一年的论文建模一个问题,我遇到了一个我认为没有记录的场景。在示例curl/curl_fuse.cpp 中,一个有状态的curl_worker 角色定义和生成如下:

behavior curl_worker(stateful_actor<curl_state>* self, const actor& parent) {
   return {
      ...
   };
}

...

behavior curl_master(stateful_actor<master_state>* self) {
   self->spawn<detached+linked>(curl_worker, self));
}

我知道这种方法的目的是隔离 Actor 的状态并防止循环引用,但是是否可以构造初始 curl_state 并在生成期间将其传递给 Actor?

我知道这可以使用基于类的演员来完成,但是由于上述引用问题,我想避免这些。

【问题讨论】:

    标签: c++ c++11 actor c++-actor-framework


    【解决方案1】:

    是的,您可以将任意参数传递给spawn 来初始化您的actor,如下例所示:

    struct my_state {
      int value;
    };
    
    behavior my_actor(stateful_actor<my_state>* self, my_state ms) {
      self->state = std::move(ms);
      // ...
    }
    
    void caf_main(actor_system& sys) {
      auto hdl = sys.spawn(my_actor, my_state{42});
      // ...
    }
    

    但是,CURL 示例在状态中存储了一个self 指针。这变得很棘手,因为在这种情况下,您无法在生成 actor 之前初始化状态。最好的办法是在构造函数之外设置指针。

    请记住,无论如何,您都需要为状态提供默认构造函数,因为 CAF 在输入my_actor 之前创建状态。您当然可以立即覆盖它,但 CAF 仍然需要在初始时构造状态。

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      相关资源
      最近更新 更多