gpt4 book ai didi

c++ - 为什么 CAF system.registry() 应该在 put(atom_value) 之后自动调用 erase(atom_value)

转载 作者:行者123 更新时间:2023-11-30 04:58:44 25 4
gpt4 key购买 nike

我想在 caf-0.15.7 中使用 system.registry() 通过调用 put(atom_value, actor ),我的进度不会自动终止,它会停止,直到我杀死它。

然而,当我明确添加 erase() 时,它将退出。

实际上正如 CAF 手册第 8 节所说:

Actors are removed automatically when they terminate.

这就是我想要的。所以我想知道这是否是错误。

  • 我在 MacOS 10.13.4 上运行
  • 编译器是 Apple LLVM 版本 9.1.0 (clang-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;

}

最佳答案

您的进程不会终止,因为 CAF 的参与者系统在关闭之前等待所有参与者。通常的 CAF 应用程序仅使用 main 来启动 actor。

Actors are removed automatically when they terminate.

这就是我想要的。

在您从示例中的注册表中删除参与者的那一刻,它们将变得无法访问并因此终止。一旦您的 Actor 全部终止, Actor 系统就会关闭。但是,您的代码片段永远不会显式终止 world 参与者,即它永远不会调用 self->quit()。您可以通过 anon_send_exit(world_actor, exit_reason::user_shutdown) 强制执行。如手册中所述,终止它还会将其从注册表中删除。

关于c++ - 为什么 CAF system.registry() 应该在 put(atom_value) 之后自动调用 erase(atom_value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51542471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com