私は現在、中規模のソフトウェアプロジェクトをリファクタリングしているところです。これには、複数のスレッドで使用される中央のカーネルのようなクラスが含まれています。現在、このクラスは、Glib::Dispatcher
複数のスレッドによって発行されるシグナルを処理するためにを使用します。glibmm
リファクタリングプロセスの1つの目標は、 (新しいフレームワークとして使用されるため)完全に取り除くことであるため、をQt
使用してディスパッチャ機能を「シミュレート」する方法を見つけようとしていBoost
ます。Boost.Signals
私はすでにとを調べましBoost.Signals2
たが、これらのライブラリのどちらもディスパッチャに代わるものを提供していないようです。
コーディネーターが何をすべきかを明確にするために、公式ドキュメントからの簡単な説明を次に示します。
Glib::Dispatcherはsigc::signalと同様に機能します。ただし、通常の信号とは異なり、通知はパイプを介して非同期で行われます。これは、スレッド間で通信するためのシンプルで効率的な方法であり、単一のGUIスレッドを持つスレッドモデルで特に役立ちます。
オペレーティングシステムの内部I/Oロックを除いて、ミューテックスロックは含まれていません。これは、いくつかの使用規則を意味します。
- シグナルに接続して通知を受信できるスレッドは1つだけですが、ロックしなくても複数の送信者が許可されます。
- GLibメインループは受信スレッドで実行する必要があります(これは通常GUIスレッドになります)。
- Dispatcherオブジェクトは、レシーバースレッドによってインスタンス化される必要があります。
- 余分なロックを回避したい場合は、送信側スレッドを作成する前にDispatcherオブジェクトをインスタンス化する必要があります。
- Dispatcherオブジェクトは、レシーバースレッドによって削除される必要があります。
- 同じレシーバースレッドによってインスタンス化されるすべてのDispatcherオブジェクトは、同じメインコンテキストを使用する必要があります。
正しい方向への指針を教えていただけますか?これは私が使用して達成できる種類の機能Boost.Signals
ですかBoost.Signals2
?
編集:コメンターが正しく指摘したように、使用Qt
することはおそらくオプションでしょう。ただし、リファクタリングしているクラスは非常に低レベルであるため、この追加の依存関係を追加したくありません。