Я прочитал некоторые использования Stateful_actor под примеры / ротор / curl_fuse.cpp а также libcaf_core / тест / 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; }
};
};
Можем ли мы объявить состояния как поля в
class-based actor
получить те же эффекты? Или есть какая-то особая обработка вstateful_actor
(например, потокобезопасный доступ)?
Среда выполнения CAF предполагает, что субъекты изолированы, то есть только самому субъекту разрешен доступ к его состоянию. Следовательно, доступ к состоянию актера никогда не синхронизируется. Меж-актерская коммуникация использует передачу сообщений, таким образом избегая гоночных условий.
Активные операторы позволяют программистам писать меньше классов (и, следовательно, меньше стандартного кода), но есть также одно заметное различие между ClassCounter
а также StatefulCounter
: время жизни переменных. В ClassCounter
переменная-член i
живет до деструктора ClassCounter
называется. Так как актеры подсчитывают ссылки, деструктор запускается, если на него не остается ссылки, то есть нет actor
или же actor_addr
Дескриптор актера существует. В StatefulCounter
, CounterState
член создается, если субъект инициализируется и уничтожается, если он заканчивается.
Государство существует только до тех пор, пока актер жив. Это особенно полезно для прерывания циклов. Если у вас есть два актера A
а также B
у вас есть цикл, если A
содержит ссылку на B
через переменную-член и наоборот. Использование действующих лиц вместо этого нарушает этот цикл. A
выпустит свою ссылку на B
автоматически при выходе и наоборот.
Других решений пока нет …