首页 > 解决方案 > CAF 中 stateful_actor 的初始状态

问题描述

我正在使用 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));
}

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

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

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

解决方案


是的,你可以传递任意参数来spawn初始化你的演员,就像在这个例子中一样:

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 仍然需要最初构造状态。


推荐阅读