2016-04-25 57 views
3

我目前有一个应用程序使用手工制作的演员。我的计划是将其移植到libcaf。端口手工制作系统libcaf

目前的状态是: 我有一个很大的全局消息队列在我的系统(又名演员)订阅得到他们的消息。他们用消息来回应该全局队列。

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

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

我的移植想法如下:我使用一个全局actor来替换我的全局消息队列,并处理消息的注册。这样,我可以轻松记录消息以进行调试,并且我不需要让所有演员知道所有可能的目标。

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

在我目前的系统中,我产生了GUI线程+系统。它等待RT初始化。在gui线程产生后,我切换到RT抢占优先级并创建其他系统,缺省堆栈等等。当所有的东西都安装完成后,我通知gui RT已启动。现在我的系统被启动。

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

我的问题是: 我怎样才能从libcaf中的RT线程分离GUI角色/线程? 你会推荐在单独的过程中分离GUI吗? 我可以在不同的RT优先级线程上产生actor吗?

编辑:我找到spawn选项detached。产生的演员(独立演员的小孩)是否在同一个线程上?

回答

2

当前状态是:我有一个大的全局消息队列,我的系统(aka actors)会订阅他们的消息。他们用消息来回应该全局队列。

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

CAF已经发布/订阅似乎很适合的团体。消费者只需加入一个知名团体,生产者就可以发送给它。这给你准确的解耦你正在寻找的发送者和接收者。

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

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

我该如何从libcaf中的RT线程分离GUI角色/线程?你会推荐在单独的过程中分离GUI吗?

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

即将到来的0.15,你也可以使用不同的actor_system实例与分开的调度程序。这可以为您节省一些开销,但我仍然希望将GUI移至自己的进程。

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

我发现分离的产卵选项。产生的演员(独立演员的小孩)是否在同一个线程上?

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

我可以在不同的RT优先级线程上产生actor吗?

简答:没有。 CAF使用std::thread接口,该接口是便携式的,但不支持RT优先级。在分离actor时添加优先级标志是可行的,但像这样的平台特定功能不在我们的待办事项列表中。这就是说,我们当然会接受添加RT优先级支持的CAF补丁。

+0

谢谢你精心设计的答案!我要写一个概念证明。关于线程属性:它大多只是'sched_setscheduler'和'mlockall',需要在RT线程上调用一次。所以我想没有什么特别添加到libcaf。 –