Начальное состояние для 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 все еще должен изначально создать состояние.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]