我目前正在重構一箇中等規模的軟件項目。它包含一個由多個線程使用的中央內核類。目前,該類使用Glib::Dispatcher
來處理多線程發出的信號。由於重構過程的一個目標是完全擺脫glibmm
(因爲Qt
將用作新框架),所以我試圖找出如何使用Boost
「模擬」調度程序功能的方法。我已經看過Boost.Signals
和Boost.Signals2
,但這些庫中的任何一個似乎都不能提供調度程序的替代方案。是否有一些用於模擬Glib :: Dispatcher的Boost功能?
爲了澄清什麼,調度員應做的,這裏有一個簡短的描述從the official documentation:
油嘴::調度員的工作原理類似於sigc ::信號。但與 正常信號不同,通知通過 管道異步發生。這是一種在線程之間進行通信的簡單高效的方式,並且在具有單個GUI的線程模型中特別有用。
除了操作系統的 內部I/O鎖定之外,不涉及互斥鎖。這意味着一些使用規則:
- 只有一個線程可以連接到信號並接收通知,但多個 發送者被允許,即使沒有鎖定。
- GLib主循環必須在接收線程中運行(這通常是GUI線程)。
- Dispatcher對象必須由接收者線程實例化。
- 如果您想避免額外鎖定,則應在創建任何發件人線程之前實例化Dispatcher對象。
- Dispatcher對象必須被接收者線程刪除。
- 由同一接收者線程實例化的所有分派器對象必須使用相同的主要上下文 上下文。
你能給我一些正確的方向指針嗎?這是我可以使用Boost.Signals
或Boost.Signals2
實現的功能嗎?
編輯:作爲評論者正確指出,使用Qt
也許是一種選擇。但是,我正在重構的類是非常低級的,我不想添加這個額外的依賴項。
Qt有一個信號框架,它完全符合你的需求。有沒有理由不使用它? –
@DavidRodríguez-dribeas是的,要被重構的類是相當低級的,我不想將依賴包括到UI框架中(它可能很容易在將來改變,就像它現在正在改變一樣)。我會在我的問題中提到這一點。 – Gnosophilon