非阻塞循环{while(QMutex :: trylock());}如何工作?

时间:2012-04-13 07:29:30

标签: qt loops nonblocking

在关于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(); 
} 

1 个答案:

答案 0 :(得分:3)

如果您在GUI线程中转动tryLock(),那么它当然会阻止您的用户界面。 tryLock()不会旋转事件循环或类似的东西。在您的情况下,tryLock()循环与调用lock()相同。

tryLock()的非阻塞替代方法应如下使用:如果失败,则等待再试一次。您设置了singleShot QTimer来启动重试时段。

在任何情况下,从工作线程向等待线程发送Qt信号可能更容易,而不是实现自己的同步方式。