Qt:QMutex
0、说明
QMutex类提供了线程间的同步控制。
QMutex的目的是,保护Object、数据结构、代码块,以便每次只有一个线程能访问它(类似Java中的synchronized关键字)。不过更好的情况下是用QMutexLocker来实现互斥,因为这能使加锁、解锁更一致。
例如,有一个在打印两行消息的函数:
int number = 6; void method1() { number *= 5; number /= 4; } void method2() { number *= 3; number /= 2; }
如果这两个函数按顺序执行,那么会发生以下情况:
// method1() number *= 5; // number is now 30 number /= 4; // number is now 7 // method2() number *= 3; // number is now 21 number /= 2; // number is now 10
但是如果这两个方法同时被两个线程调用,那么执行结果可能异常:
// Thread 1 calls method1() number *= 5; // number is now 30 // Thread 2 calls method2(). // // Most likely Thread 1 has been put to sleep by the operating // system to allow Thread 2 to run. number *= 3; // number is now 90 number /= 2; // number is now 45 // Thread 1 finishes executing. number /= 4; // number is now 11, instead of 10
如果我们在其上添加互斥锁,我们就能得到我们想要的结果:
QMutex mutex; int number = 6; void method1() { mutex.lock(); number *= 5; number /= 4; mutex.unlock(); } void method2() { mutex.lock(); number *= 3; number /= 2; mutex.unlock(); }
加锁后,在任意时间只有一个线程能够修改number,这样最终结果就是正确的。
当我们在线程中调用lock()时,其它线程如果想调用lock()方法就会阻塞,直到第一个lock()的线程调用unlock()释放锁。对于lock(),它的一个非阻塞锁是tryLock()。
非争用情况下,QMutex被优化地非常高效。在非递归的QMutex之上如果没有争用,它也不会释放内存。它的构造与销毁没有任何开销,这意味着可以很好地构造很多QMutex。
1、模块和加载项
Header: | #include <QMutex> |
qmake: | QT += core |
Inherited By: |
2、构造
3、静态字段
enum | RecursionMode | { Recursive, NonRecursive } | 一个Thread是否可以多次调用lock() |
4、实例方法
返回值类型 |
方法 |
说明 |
bool | isRecursive() | 当该Mutex是recursive时返回true |
void | lock() | 加锁 |
bool | tryLock(int timeout = 0) |
尝试加锁,加锁成功返回true。 如果另一个Thread已经加锁,该方法将会等待timeout ms再尝试。 |
bool | try_lock() | 尝试加锁。等同于tryLock()。 |
bool | try_lock_for(std::chrono::duration<Rep, Period> duration) | |
bool | try_lock_until(std::chrono::time_point<Clock, Duration> timePoint) | |
void | unlock() | 解锁 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性