Понимание функции субъекта CAF, которая возвращает void

Я знаю, что актеры могут быть реализованы по функциям. Следующий фрагмент кода взят из примеров CAF github /hello_world.cpp.

Я знаю первый метод реализации, который связывает пару обработчиков сообщений с актером. Актер будет жив на заднем плане и будет вызван событиями, а затем завершится, когда self->quit называется.

Но второй ничего не возвращает, где его обработчик сообщений? И, похоже, нет self->quit-подобная функция, чтобы завершить себя. Это живой, когда hello_world возвращается? Или он просто завершается после завершения ответа в then?

behavior mirror(event_based_actor* self) {
return {
[=](const string& what) { ... }
[=](int) { ...}
}
};

void hello_world(event_based_actor* self, const actor& buddy) {
self->sync_send(...).then(
...
);
}

int main() {
auto mirror_actor = spawn(mirror);
spawn(hello_world, mirror_actor);
await_all_actors_done();
shutdown();
}

Обновлено,

Актер завершит свою работу, если в его стеке поведения нет обработчиков сообщений.

Четное hello_word ничего не возвращает как поведение слушателя актера. Актер все еще жив, когда функция возвращается. Поскольку sync_send добавил then-behavior в стеке, чтобы подготовить ответ от зеркала. После одного выстрела then-behavior появляется, чтобы закончить ответ, стек пуст, тогда актер вправе завершить сам.

4

Решение

Но второй ничего не возвращает, где его обработчик сообщений? И, похоже, нет self->quit-подобная функция, чтобы завершить себя. Жив ли когда hello_world возвращается? Или это просто завершиться после того, как закончил ответ в то время?

Так как функция hello_world возвращает недействительным, а не behavior, субъект, выполняющий эту функцию, автоматически завершает работу, как только достигает конца функции. Этот актер выполняет три действия после появления:

  1. Отправить сообщение через sync_send,
  2. Ждите соответствующего ответа.
  3. Прервать.
4

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

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