Qt信号是否可以从另一个QThread安全地发出

Aur*_*ien 3 qt multithreading signals-slots qthread

QThread在我的应用程序中使用了一些.

我的对象在不同的​​线程中"活动"(它们的所有者线程为Qt意味着它是不同的)并使用带有排队连接的信号/槽来进行通信.

现在,我有这个问题:

  • 对象"A"生活在QThread"A"中
  • 对象"B"生活在QThread"B"中
  • 桂生活在"主线"

然后 :

  • 对象"A" B::foo从其自己的线程"A" 调用"B"实例上的方法
  • B::foo使用互斥锁保护此方法共享的资源,这里没有问题B::foo从线程"A"执行
  • B::foo方法内部,对象"B"发出信号barSignal

我对他的配置有一些疑问:

  • 从不是"B"所有者的线程发出对象"B"的信号是否安全QThread

  • 用于Qt::AutoConnection在生活在"Qt主线程"中的GUI对象中接收此信号是否安全?

  • Qt::AutoConnection在生活在它自己的QThread"C" 中的对象"C"中使用a 接收此信号是否安全?

我的测试往往对一切都说"是".通过阅读Qt emit代码,似乎没问题.但它没有在Qt文档中找到任何关于" 从一个不是发射器的所有者线程的线程发出信号 "的内容.

Nic*_*aus 6

如果使用自动或排队连接,从其他线程发出信号是安全的.在接收没有亲和力的线程中发出信号的情况下,推断自动排队QObject.直接连接不是线程安全的.

文档中有一个"跨线程的信号和插槽"部分,用于处理向不同线程中的对象发射信号.

排队连接 - 当控制返回到接收者线程的事件循环时,将调用该槽.插槽在接收器的线程中执行.

可以通过向connect()传递一个附加参数来指定连接类型.请注意,如果事件循环在接收者的线程中运行,则当发送方和接收方位于不同的线程中时使用直接连接是不安全的,原因与在另一个线程中的对象上调用任何函数是不安全的相同.

QObject :: connect()本身是线程安全的.

  • 还有[一篇Qt wiki文章](http://wiki.qt.io/ThreadsEventsQObjects)我建议阅读更多背景资料. (4认同)