Понимание stateful_actor

Я прочитал некоторые использования 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; }
};
};

5

Решение

Можем ли мы объявить состояния как поля в class-based actor получить те же эффекты? Или есть какая-то особая обработка в stateful_actor (например, потокобезопасный доступ)?

Среда выполнения CAF предполагает, что субъекты изолированы, то есть только самому субъекту разрешен доступ к его состоянию. Следовательно, доступ к состоянию актера никогда не синхронизируется. Меж-актерская коммуникация использует передачу сообщений, таким образом избегая гоночных условий.

Активные операторы позволяют программистам писать меньше классов (и, следовательно, меньше стандартного кода), но есть также одно заметное различие между ClassCounter а также StatefulCounter: время жизни переменных. В ClassCounterпеременная-член i живет до деструктора ClassCounter называется. Так как актеры подсчитывают ссылки, деструктор запускается, если на него не остается ссылки, то есть нет actor или же actor_addr Дескриптор актера существует. В StatefulCounter, CounterState член создается, если субъект инициализируется и уничтожается, если он заканчивается.

Государство существует только до тех пор, пока актер жив. Это особенно полезно для прерывания циклов. Если у вас есть два актера A а также Bу вас есть цикл, если A содержит ссылку на B через переменную-член и наоборот. Использование действующих лиц вместо этого нарушает этот цикл. A выпустит свою ссылку на B автоматически при выходе и наоборот.

5

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

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