3

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

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

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

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

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

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

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

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

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

编辑:我找到了spawn选项detached。生成的演员(分离演员的孩子)是否在同一个线程上?

4

1 回答 1

2

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

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

CAF 的发布/订阅组似乎很适合这里。消费者只需加入一个知名组,生产者发送给它。这为您提供了您正在寻找的发送者和接收者的准确解耦。

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

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

如何将 GUI 角色/线程与 libcaf 中的 RT 线程分开?您会建议在单独的过程中分叉 GUI 吗?

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

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

顺便说一句,您不需要实际使用fork. 您可以简单地运行您的应用程序,publish将一个参与者连接到一个端口,然后通过remote_actor.

我发现生成选项已分离。生成的演员(分离演员的孩子)是否在同一个线程上?

一个分离的actor总是在它自己的线程中运行。

我可以在不同的 RT 优先级线程上生成演员吗?

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

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

于 2016-04-26T09:13:49.187 回答