Начальное состояние для stateful_actor в CAF

Я использую 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 и передать его актеру во время спавна?

Я знаю, что это может быть сделано с актерами на основе класса, однако я хотел бы избежать тех из-за вышеупомянутой ссылочной проблемы.

1 ответ

Да, вы можете передавать произвольные аргументы 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 указатель в состоянии. Это сложно, потому что в этом случае вы не можете инициализировать состояние до появления актера. Лучшее, что вы можете сделать, это установить указатель вне конструктора.

Имейте в виду, что вам нужно предоставить конструктор по умолчанию для состояния независимо, потому что CAF создает состояние перед вводом my_actor, Конечно, вы можете переопределить его немедленно, но CAF все еще должен изначально создать состояние.

Другие вопросы по тегам