安全交叉线程信号/插槽C ++

时间:2010-05-03 12:24:30

标签: c++ boost signals signals-slots

似乎唯一为Signal类和插槽中调用的内容提供安全跨线程信号的实现是QT。 (也许我错了?)。

但我不能在我正在做的项目中使用QT。那么我如何从不同的线程提供安全的Slots调用(例如使用Boost :: signals2)?插槽内的互斥是唯一的方法吗?我认为信号2可以保护自己,但不能保护插槽内的信号。

由于

2 个答案:

答案 0 :(得分:1)

您可以结合使用boost :: bind和boost ASIO来创建跨线程调用。

# In Thread 2
boost::asio::io_service service;
boost::asio::io_service::work work (service); // so io service won't stop if there is no work 
service.run() # starting work thread

# In Thread 1
service.post (boost::bind (&YourClass::function, &yourClassInstance, parameter1, parameter2))

线程2将进入循环并执行绑定函数。我想你也可以将Boost :: Signals2调用调用到这个循环中。

但请注意:如果您执行跨线程信令,请确保在调用时目标对象仍然存在。您可以通过删除目标析构函数中的所有连接(不在其基类析构函数中,也可以查看Signals-Trackable Class)来确认这一点

我不太喜欢Boost :: Signals2,因为它的堆栈跟踪和编译时间很长(blog post)。

答案 1 :(得分:0)

确切地说,它不是信号槽实现,但是有一个Twisted延迟模式的C ++实现,它实现了与跨线程信号槽机制类似的目标。如果某人没有出现并发布更好的解决方案,可能值得一看:http://sourceforge.net/projects/deferred/