2

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(); 
} 
4

1 回答 1

3

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

tryLock()应该按如下方式使用非阻塞替代方法:如果失败,则等待并重试。您设置了一个singleShotQTimer 来触发您的重试槽。

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

于 2012-05-29T19:07:00.267 回答