我在我的应用程序中使用了一些QThread
。
我的对象"生活"在不同的线程中(它们的所有者线程为Qt意味着它是不同的)并使用带有排队连接的信号/插槽进行通信。
现在,我遇到了这个问题:
QThread
" A" QThread
" 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文档中找到任何关于" 从一个不是发射器所有者线程"的线程发出信号的内容。
答案 0 :(得分:6)
从其他线程发出信号是安全的,如果您使用自动或排队连接。在接收QObject
没有亲和力的线程中发出信号的情况下,自动推断为排队。直接连接不线程安全。
文档中有"Signals and Slots Across Threads"部分处理向不同线程中的对象发射信号。
排队连接 - 当控制返回到接收者线程的事件循环时,调用该槽。插槽在接收器的线程中执行。
也
可以通过向connect()传递一个额外的参数来指定连接类型。请注意,如果事件循环在接收者的线程中运行,则当发送方和接收方位于不同的线程中时使用直接连接是不安全的,原因与在另一个线程中的对象上调用任何函数是不安全的相同。
QObject :: connect()本身是线程安全的。