3

私は現在、手作りのアクターを使用するアプリケーションを持っています。私の計画は、libcaf に移植することです。

現在の状態は次のとおりです。システム (別名アクター) がサブスクライブしてメッセージを取得する 1 つの大きなグローバル メッセージ キューがあります。それらは、そのグローバル キューへのメッセージで応答します。

システム全体は、Linux rt-preempt カーネルで実行されるリアルタイム アプリケーションです。GUI スレッドはシステム (アクター) そのものですが、RT 優先ではありません。

現時点では、私のシステムはメッセージの受信者を知る必要はありません。

私の移植のアイデアは次のとおりです。1 つのグローバル アクターをグローバル メッセージ キューの代わりとして使用し、それがメッセージの登録を処理します。このようにして、デバッグ目的でメッセージのログを簡単に取得でき、すべてのアクターに考えられるすべてのターゲットを知らせる必要はありません。

現実世界への連絡を処理する IO システム (canbus) があります。

現在のシステムでは、GUI スレッド + システムを生成します。RT が初期化されるのを待ちます。GUI スレッドが生成された後、RT Preempt 優先順位に切り替えて、他のシステムを作成し、スタックを事前にフォールトします。すべての設定が完了したら、RT が起動していることを GUI に通知します。これでシステムが初期化されました。

致命的なことが発生したり、システムをシャットダウンする必要がある場合は、メッセージを送信すると、すべてのシステムがシャットダウンし、すべてのスレッドが参加します。

私の質問は次のとおりです。libcaf の RT スレッドから GUI アクター/スレッドを分離するにはどうすればよいですか? 別のプロセスで GUI をフォークすることをお勧めしますか? 異なる RT 優先スレッドでアクターをスポーンできますか?

編集:spawnオプションが見つかりましたdetached。スポーンされたアクター (切り離されたアクターの子) は同じスレッド上にありますか?

4

1 に答える 1

2

現在の状態は次のとおりです。システム (別名アクター) がサブスクライブしてメッセージを取得する 1 つの大きなグローバル メッセージ キューがあります。それらは、そのグローバル キューへのメッセージで応答します。

現時点では、私のシステムはメッセージの受信者を知る必要はありません。

CAF には、ここに適していると思われるパブリッシュ/サブスクライブ グループがあります。コンシューマーはよく知られているグループに参加するだけで、プロデューサーはそれに送信します。これにより、探している送信者と受信者を正確に切り離すことができます。

致命的なことが発生したり、システムをシャットダウンする必要がある場合は、メッセージを送信すると、すべてのシステムがシャットダウンし、すべてのスレッドが参加します。

これを簡単に実現するには、2 つの方法があります。1 つはグループを使用することですが、致命的なシステム状態が検出されたときに、すべてのアクターがそのグループにサブスクライブする必要があります。または、単一の「ルート」アクタを使用して他のすべてのアクタをスポーンし、linkedスポーン中は常にフラグを使用することもできます。このように、ルート アクターを殺すと、その子を再帰的に殺します。

libcaf の RT スレッドから GUI アクター/スレッドを分離するにはどうすればよいですか? 別のプロセスで GUI をフォークすることをお勧めしますか?

0.14 では、GUI を独自のプロセスに移動してから、 経由で接続する必要がありremote_actorます。副作用として、これにより GUI がアプリケーション ロジックから切り離され、GUI でのクラッシュがシステムの他の部分に影響を与えなくなります。もちろん、このシナリオでは、ローカルホストの通信とシリアル化に料金がかかります。

今後の 0.15 では、actor_system個別のスケジューラーで異なるインスタンスを使用することもできます。これによりオーバーヘッドを少し節約できますが、GUI を独自のプロセスに移動することをお勧めします。

ちなみに、実際に使う必要はありませんfork。単純にアプリケーションを実行し、publish1 つのアクターをポートに接続してから、GUI を 経由で接続できますremote_actor

スポーンオプションが切り離されていることがわかりました。スポーンされたアクター (切り離されたアクターの子) は同じスレッド上にありますか?

切り離されたアクターは、常に独自のスレッドで実行されます。

異なる RT 優先スレッドでアクターをスポーンできますか?

短い答え:いいえ。CAF は、std::thread移植可能ですが、RT 優先度をサポートしていないインターフェイスを使用します。アクターをデタッチするときに優先度フラグを追加することは可能ですが、そのようなプラットフォーム固有の機能は、ToDo リストにはありません。

そうは言っても、RT優先サポートを追加するCAFへのパッチはもちろん受け入れます。

于 2016-04-26T09:13:49.187 に答える