看起来,QT是唯一提供安全的跨线程信号(Safe Cross-Thread Signals)的实现,既适用于Signal类,也适用于在Slot中调用的东西。(也许我错了?)
但我不能在我正在进行的项目中使用QT。那么我该如何从不同的线程提供安全的Slots调用(例如使用Boost::signals2)?Slot内部的Mutex是唯一的方法吗?我认为signals2保护自己,但是并没有保护Slot内部的操作。
谢谢
看起来,QT是唯一提供安全的跨线程信号(Safe Cross-Thread Signals)的实现,既适用于Signal类,也适用于在Slot中调用的东西。(也许我错了?)
但我不能在我正在进行的项目中使用QT。那么我该如何从不同的线程提供安全的Slots调用(例如使用Boost::signals2)?Slot内部的Mutex是唯一的方法吗?我认为signals2保护自己,但是并没有保护Slot内部的操作。
谢谢
# 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))
第二个线程将进入循环并执行绑定的函数。我认为你也可以在此循环中调用Boost::Signals2。
但要注意:如果进行跨线程信号传递,请确保目标对象在被调用时仍然存在。您可以通过在目标析构函数中删除所有连接来保证(不要在其基类析构函数中删除,还请参见Signals-Trackable Class)。
我不太喜欢Boost::Signals2,因为它的堆栈跟踪和编译时间非常长(博客文章)。
这不是一个信号槽实现,但有一个C++实现了Twisted的Deferred模式,实现了类似于跨线程信号槽机制的相似目标。如果没有更好的解决方案出现,它可能值得一看:http://sourceforge.net/projects/deferred/