在关于QMutex
的Qt文档中,据说:
(...)当你在一个线程中调用lock()时,尝试在同一个地方调用lock()的其他线程将阻塞,直到获得锁定的线程调用unlock()。 lock()的非阻塞替代方法是tryLock()。 (...)
我多次使用此代码:
QMutex mutex;<br>
while( !mutex.tryLock() );
有人可以解释一下这个tryLock()
方法是如何构建的,while()
循环不会挂起整个程序吗?
两个线程共享一个QMutex
并充当通信FIFO - 当一个线程正在发送数据,而另一个数据被调度到第二个线程时,该线程正在等待第一个线程完成。通信符合Modbus标准 - send1-receive1,send2-receive2。
您无法进行并行发送和接收。所以总是一个线程处于活动状态,其余线程正在等待。
QMutex mutex;
thread1() {
while( !mutex.tryLock() )
;
doThread1Job();
}
thread2() {
while( !mutex.tryLock() )
;
doThread2Job();
}
答案 0 :(得分:3)
如果您在GUI线程中转动tryLock()
,那么它当然会阻止您的用户界面。 tryLock()
不会旋转事件循环或类似的东西。在您的情况下,tryLock()
循环与调用lock()
相同。
tryLock()
的非阻塞替代方法应如下使用:如果失败,则等待再试一次。您设置了singleShot
QTimer来启动重试时段。
在任何情况下,从工作线程向等待线程发送Qt信号可能更容易,而不是实现自己的同步方式。