Почему CAF system.registry () должен автоматически вызывать erase (atom_value) после put (atom_value)

Я хочу использовать system.registry () в кафе-0.15.7 чтобы сделать актеров доступными по всей системе по имени, когда я назначаю двух актеров по имени, вызывая put (atom_value, actor), мой прогресс не будет прекращаться автоматически, и он остановится, пока я не убью его.

Однако, когда я добавлю erase () явно, он выйдет.

На самом деле, как руководство CAF раздел 8 сказал:

Актеры удаляются автоматически, когда они прекращаются.

И это то, что я хочу. Так что мне интересно, это ошибка или нет.

  • Я бегу на MacOS 10.13.4,
  • компилятор Apple LLVM версия 9.1.0 (Лязг-902.0.39.2).
  • Версия CAF: 0.15.7

Для воспроизведения моих результатов, пожалуйста, запустите следующий код C ++:

#include <string>
#include <iostream>
#include "caf/all.hpp"#include "caf/io/all.hpp"

using std::endl;
using std::string;
using namespace caf;

atom_value world_atom = atom("world_act");
atom_value hello_atom = atom("hello_act");

behavior world(event_based_actor *self) {

return behavior {
[=](const string &what) {
aout(self) << "Message: " << what << endl;
return std::string{"World"};
}
};
}

void hello(event_based_actor* self) {

string out_msg{"Hello "};
auto tmp = self->home_system().registry().get(world_atom);
auto buddy = actor_cast<actor>(tmp);

self->request(actor_cast<actor>(tmp), std::chrono::seconds(2), out_msg).then(
[=] (const string& what) {
aout(self) << "Message: " << what << endl;
});
}

int main() {
actor_system_config cfg;
actor_system system{cfg};

auto world_actor = system.spawn(world);
system.registry().put(world_atom, world_actor);

auto hello_actor = system.spawn(hello);
system.registry().put(hello_atom, hello_actor);

std::cout << "current running: " << system.registry().running() << endl;

/* Uncomment the following three lines if you want to stop automatically */
//  getchar();
//  system.registry().erase(hello_atom);
//  system.registry().erase(world_atom);

return 0;

}

1

Решение

Ваш процесс не прекратится, потому что система акторов CAF ждет всех участников, прежде чем завершить работу. Обычное приложение CAF использует main только раскрутить актеров.

Актеры удаляются автоматически, когда они прекращаются.

И это то, что я хочу.

В тот момент, когда вы удаляете своих актеров из реестра в вашем примере, они становятся недоступными и в результате прекращают работу. Как только все ваши актеры заканчиваются, система актеров отключается. Тем не менее, ваш фрагмент никогда не завершает world актер явно, то есть он никогда не вызывает self->quit(), Вы можете заставить это через anon_send_exit(world_actor, exit_reason::user_shutdown), Завершение его также удалит его из реестра, как указано в руководстве.

1

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

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