Multithreading 可以从另一个QThread安全地发出Qt信号吗
我在应用程序中使用了一些Multithreading 可以从另一个QThread安全地发出Qt信号吗,multithreading,qt,signals-slots,qthread,Multithreading,Qt,Signals Slots,Qthread,我在应用程序中使用了一些QThread 我的对象“生活”在不同的线程中(它们的所有者线程作为Qt的意思是不同的),并使用带有排队连接的信号/插槽进行通信 现在,我有一个问题: 对象“A”位于QThread“A”中 对象“B”存在于QThread“B”中 Gui生活在“主线程”中 然后: 对象“A”从其自己的线程“A”调用“B”实例上的方法B::foo 此B::foo方法共享的资源使用互斥锁进行保护,从线程“a”执行B::foo没有问题 在B::foo方法中,对象“B”发出信号barSign
QThread
我的对象“生活”在不同的线程中(它们的所有者线程作为Qt的意思是不同的),并使用带有排队连接的信号/插槽进行通信
现在,我有一个问题:
- 对象“A”位于
“A”中QThread
- 对象“B”存在于
“B”中QThread
- Gui生活在“主线程”中
- 对象“A”从其自己的线程“A”调用“B”实例上的方法
B::foo
- 此
方法共享的资源使用互斥锁进行保护,从线程“a”执行B::foo
没有问题B::foo
- 在
方法中,对象“B”发出信号B::foo
barSignal
- 从不是“B”所有者的线程发出对象“B”的信号是否安全
- 使用
在“Qt主线程”中的GUI对象中接收此信号是否安全Qt::AutoConnection
- 使用
在对象“C”中接收此信号安全吗?对象“C”居住在它自己的Qt::AutoConnection
“C”中QThread
emit
代码,它似乎正常。
但是它在Qt文档中没有找到任何关于“从不是发射器所有者线程的线程发出信号”的内容。如果使用自动或排队连接,从其他线程发出信号是安全的。当信号在接收
QObject
没有亲缘关系的线程中发出时,Auto被推断为排队。直接连接不是线程安全的
文档中有一节介绍如何向不同线程中的对象发送信号
排队连接-当控制返回到接收方线程的事件循环时,将调用插槽。插槽在接收器的线程中执行
也
可以通过向connect()传递附加参数来指定连接类型。请注意,如果事件循环正在接收方的线程中运行,那么当发送方和接收方位于不同线程中时使用直接连接是不安全的,原因与在另一个线程中的对象上调用任何函数是不安全的相同
QObject::connect()本身是线程安全的
还有一点我建议你多读一些背景知识。