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:

QRecursiveMutex

2、构造

QMutex(QMutex::RecursionMode mode)
QMutex()

 

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() 解锁
posted @   ShineLe  阅读(1908)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示