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

时间:2016-04-29 10:25:49

标签: multithreading qt signals-slots qthread

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

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

现在,我遇到了这个问题:

  • 对象" A"住在QThread" A"
  • 对象" B"住在QThread" B"
  • Gui住在"主线"

然后:

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

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

  • 发出物体信号是否安全" B"来自一个不是" B"所有者QThread

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

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

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

1 个答案:

答案 0 :(得分:6)

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

文档中有"Signals and Slots Across Threads"部分处理向不同线程中的对象发射信号。

  

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

  

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

     

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