c++ - 将手工系统移植到 libcaf

标签 c++ linux multithreading preempt-rt c++-actor-framework

我目前有一个使用手工制作 Actor 的应用程序。我的计划是将它移植到 libcaf。

当前状态是: 我有一个大的全局消息队列,我的系统(又名 Actor )订阅以获取他们的消息。他们向该全局队列响应消息。

整个系统是一个运行在Linux rt-preempt内核上的实时应用程序。 GUI 线程本身就是一个系统(参与者),但它不具有 RT 优先级。

现在我的系统不需要知道消息的接收者,因为接收者会为他们想要的消息进行注册。

我的移植想法如下:我使用一个全局角色来替代我的全局消息队列,它处理消息的注册。这样,我可以获得用于调试目的的消息的简单日志,并且我不需要让所有参与者都知道所有可能的目标。

我有一个 IO 系统 (canbus) 来处理与现实世界的联系。

在我当前的系统中,我生成了 GUI 线程 + 系统。它等待 RT 初始化。生成 gui 线程后,我切换到 RT Preempt 优先级并创建其他系统,预置堆栈等。当所有设置完成后,我通知 gui RT 已启动。现在我的系统已经初始化。

当发生一些致命的事情或系统需要关闭时,我会发送一条消息,所有系统都会关闭,所有线程都会加入。

我的问题是: 我如何将 GUI actor/线程与 libcaf 中的 RT 线程分开? 您会建议在单独的进程中 fork GUI 吗? 我可以在不同的 RT 优先级线程上生成 actor 吗?

编辑:我发现 spawn 选项 detached。生成的 Actor (独立 Actor 的 child )是否在同一个线程上?

最佳答案

The current state is: I have one big global message queue where my systems (aka actors) subscribe to get their messages. They respond with messages to that global queue.

Right now my systems don't need to know the receivers of their messages, because the receivers register for their wanted ones.

CAF 的发布/订阅组似乎很适合这里。消费者只需加入一个知名的群组,然后生产者发送给它。这正是您正在寻找的发送方和接收方的解耦。

When some fatal things happens or the system Needs to shut down, i send a message and all systems shut down and all threads get joined.

有两种方法可以轻松实现这一点。一种是使用组,但这要求在检测到致命系统状态时所有参与者都订阅它。或者,您可以使用单个“根”actor 来生成所有其他 actor,并在生成期间始终使用 linked 标志。这样,杀死根 actor 将递归地杀死它的 child 。

How can i seperate the GUI actor/thread from the RT thread in libcaf? Would you recommend to fork the GUI in a seperate process?

在 0.14 中,您必须将 GUI 移动到它自己的进程中,然后通过 remote_actor 连接到它。作为副作用,这将 GUI 与应用程序逻辑分离,并且 GUI 中的崩溃不会影响系统的其他部分。当然,在这种情况下,您需要为本地主机通信和序列化付费。

在即将发布的 0.15 中,您还可以使用不同的 actor_system 实例和单独的调度程序。这可以为您节省一些开销,但我仍然更愿意将 GUI 移到它自己的进程中。

顺便说一句,您不需要实际使用fork。您可以简单地运行您的应用程序,发布 一个 actor 到一个端口,然后通过 remote_actor 连接您的 GUI。

I find the spawn option detached. Are the spawned actors (childs of a detached actor) on the same thread?

分离的 actor 将始终在其自己的线程中运行。

Can i spawn actors on different RT priority threads?

简短的回答:没有。 CAF 使用std::thread 接口(interface),可移植但不支持RT 优先级。在分离 actors 时添加优先级标志是可行的,但像这样的特定于平台的功能不在我们的待办事项列表中。

话虽如此,我们当然会接受添加 RT 优先级支持的 CAF 补丁。

关于c++ - 将手工系统移植到 libcaf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36839893/

相关文章:

objective-c - 异步更新 NSTableView 数据源

python - wxPython,实时捕获子进程的输出

c++ - WTL头文件如何实现?

c++ - Gtk::Main 和 Gtk::Application::create 之间有什么区别?

linux - Bash 创建变量然后为其赋值

linux - 如何在 Linux 帧缓冲区上截取屏幕截图或电影

android - 如何使用通知和等待

c++ - 如何硬编码设置

带有声明帐户的 C++ 构造函数(int =0);

c - 文件 I/O 减慢了我的 C 循环