gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:50:18 26 4
gpt4 key购买 nike

在 Qt 文档中关于 QMutex据说:

(...) When you call lock() in a thread, other threads that try to call lock() in the same place will block until the thread that got the lock calls unlock(). A non-blocking alternative to lock() is 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();
}

最佳答案

如果您正在旋转 tryLock()在 GUI 线程中,当然它会阻塞您的用户界面。一个 tryLock()不旋转事件循环或类似的东西。在您的情况下,tryLock()循环与仅调用 lock() 相同.
tryLock() 的非阻塞替代方案应按如下方式使用:如果失败,则等待并重试。您设置了 singleShot QTimer 触发您的重试槽。

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

关于qt - 非阻塞循环 {while( QMutex::trylock() );} 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10136865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com