2016-04-25 65 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。 –