Начальное состояние для stateful_actor в CAF - PullRequest
0 голосов
/ 04 ноября 2018

Я использую 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 Ответ

0 голосов
/ 05 ноября 2018

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

...