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() 解锁

Qt:QMutex的更多相关文章

  1. Qt之QMutex

    概述 QMutex 类使得线程之间可序列化,文档中的描述为provides access serialization between threads 它被设计的初衷是用来保护一个对象.数据结构.代码段 ...

  2. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  3. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  4. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  5. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  6. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  7. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  8. Qt:正则表达式语法:

         正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式;        Qt 提供了一个Q ...

  9. Qt:QT右键菜单

    Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...

随机推荐

  1. 微信小程序入门教程之四:API 使用

    今天是这个系列教程的最后一篇. 上一篇教程介绍了,小程序页面如何使用 JavaScript 脚本.有了脚本以后,就可以调用微信提供的各种能力(即微信 API),从而做出千变万化的页面.本篇就介绍怎么使 ...

  2. collate utf8_bin是什么意思

    创建数据库时 collate utf_bin是 以二进制值比较,也就是区分大小写,collate是核对的意思 uft-8_general_ci  一般比较,不区分大小写

  3. 【程序6】用*号输出字母C的图案

    我自己写的 print(' * * *\n'); print(' * \n'); print(' * \n'); print(' * * * *\n'); 官方答案 print('*' * 10) f ...

  4. markdown介绍和使用(超全建议收藏)

    Markdown介绍 Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了.Markdown编辑器使用一套格式标记 ...

  5. Redis 学习笔记(四)RDB 和 AOF 持久化机制

    一.Redis 持久化简介 Redis 的持久化功能是区别于 Memcached 显著特性,数据持久化可以保证系统在发生宕机和重启后数据不会丢失,对于 redis 这种存储在内存中的数据库显得尤为重要 ...

  6. 求一个number数组中的最大值和最小值的差

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  7. java实现HTTPS单向认证&TLS指定加密套件

    1.HTTPS介绍 由于HTTP是明文传输,会造成安全隐患,所以在一些特定场景中,必须使用HTTPS协议,简单来说HTTPS=HTTP+SSL/TLS.服务端和客户端的信息传输都是通过TLS进行加密. ...

  8. 取消a标签的默认行动(跳转到href)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. NSMutableDictionary基本概念

    1.NSMutableDictionary 基本概念 什么是NSMutableDictionary NSMutableDictionary是NSDictionary的子类 NSDictionary是不 ...

  10. js实现网页中英文翻译

    1,html 2,metrics.js 3,需要 http://www.microsoftTranslator.com/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKk ...