Can-Qt信号可以安全地从另一个QThread发出



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

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

现在,我有一个问题:

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

然后:

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

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

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

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

  • 使用Qt::AutoConnection在居住在其自身QThread"C"中的对象"C"内接收此信号是否安全?

我的测试倾向于对所有事情都说"是"。通过阅读Qt emit代码,似乎可以。但它在Qt文档中没有发现任何关于"从不是发射器所有者线程的线程发射信号"的内容。

如果使用自动或排队连接,则从其他线程发出信号是安全的。在信号在接收QObject不具有亲和性的线程中发射的情况下,Auto被推导为排队。直接连接不是线程安全的。

文档中有一个"跨线程的信号和槽"部分,处理向不同线程中的对象发送信号的问题。

Queued Connection-当控件返回到接收器线程的事件循环时,会调用插槽。插槽在接收器的线程中执行。

还有

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

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

最新更新