Ho letto l'uso di stateful_actor sotto examples/curl/curl_fuse.cpp e libcaf_core/test/stateful_actor.cpp. Sembra che lo stateful_actor<State>
possa associare alcuni stati per l'attore dichiarando i campi in State struct
. E 'molto utile.Capire lo stateful_actor
Possiamo dichiarare gli stati come campi in class-based actor
per ottenere gli stessi effetti? O c'è qualche trattamento speciale nel stateful_actor
(ad esempio accesso alla sicurezza del thread)?
Gli attori nel seguente esempio forniscono la stessa funzionalità?
/* 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; }
};
};
Quindi il distruttore del CounterState verrà chiamato quando l'attore termina? –
mm. Penso che separare le preoccupazioni dello stato e il comportamento degli attori sia meglio per la manutenzione. –
"Quindi il distruttore del CounterState verrà chiamato quando l'attore termina?" Sì. Un attore chiude la sua casella di posta e distrugge il suo stato quando termina. Se necessario, attiverà anche i messaggi di uscita o di discesa. Qualsiasi ulteriore messaggio in arrivo verrà eliminato (attivando un messaggio di errore per i messaggi di sincronizzazione) e il collegamento a un attore terminato attiverà immediatamente il messaggio di uscita. – neverlord