我目前正在重构一个中等规模的软件项目。它包含一个由多个线程使用的中央内核类。目前,该类使用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