Я читал об использовании stateful_actor в примерах /curl/curl_fuse.cpp и libcaf_core/test/stateful_actor.cpp. Похоже, что stateful_actor<State>
может привязать некоторые состояния для актера, объявив поля в State struct
. Это очень полезно.
Можем ли мы объявить состояния как поля в class-based actor
, чтобы получить тот же эффект? Или в stateful_actor
есть какая-то особая обработка (например, доступ к потокобезопасности)?
Предоставляют ли актеры в следующем примере одинаковую функциональность?
/* Class based actor */
struct ClassCounter : caf::event_based_actor
{
caf::behavior make_behavior() override {
return {
[=](inc_atom){ i += 1; }
, [=](ret_atom){ return i; }
};
}
const char* name() const override { return "I am class-based"; }
int i = 0;
};
/* Stateful actor */
struct CounterState
{
caf::local_actor* self;
int i = 0;
const char* name = "I am stateful";
};
caf::behavior StatefulCounter(caf::stateful_actor<CounterState>* self)
{
return {
[=](inc_atom){ self->state.i += 1; }
, [=](ret_atom){ return self->state.i; }
};
};