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