【问题标题】:Safe Cross Thread Signals/Slot C++安全跨线程信号/槽 C++
【发布时间】:2010-05-03 12:24:29
【问题描述】:

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

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

谢谢

【问题讨论】:

标签: c++ boost signals signals-slots


【解决方案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)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      相关资源
      最近更新 更多