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、构造
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的更多相关文章
- Qt之QMutex
概述 QMutex 类使得线程之间可序列化,文档中的描述为provides access serialization between threads 它被设计的初衷是用来保护一个对象.数据结构.代码段 ...
- Qt:禁止qDebug的输出
Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT
- Qt:使用自定义的字体
Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体 QFontDatabase::addApplicationFont("XENOTRON.TTF" ...
- Qt:QJsonObject
0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...
- Qt:QJsonValue
0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...
- Qt:QJsonArray
0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...
- Qt:QUrl构造时的qrc前缀
参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...
- Qt:正则表达式语法:
正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式; Qt 提供了一个Q ...
- Qt:QT右键菜单
Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...
随机推荐
- 微信小程序入门教程之四:API 使用
今天是这个系列教程的最后一篇. 上一篇教程介绍了,小程序页面如何使用 JavaScript 脚本.有了脚本以后,就可以调用微信提供的各种能力(即微信 API),从而做出千变万化的页面.本篇就介绍怎么使 ...
- collate utf8_bin是什么意思
创建数据库时 collate utf_bin是 以二进制值比较,也就是区分大小写,collate是核对的意思 uft-8_general_ci 一般比较,不区分大小写
- 【程序6】用*号输出字母C的图案
我自己写的 print(' * * *\n'); print(' * \n'); print(' * \n'); print(' * * * *\n'); 官方答案 print('*' * 10) f ...
- markdown介绍和使用(超全建议收藏)
Markdown介绍 Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了.Markdown编辑器使用一套格式标记 ...
- Redis 学习笔记(四)RDB 和 AOF 持久化机制
一.Redis 持久化简介 Redis 的持久化功能是区别于 Memcached 显著特性,数据持久化可以保证系统在发生宕机和重启后数据不会丢失,对于 redis 这种存储在内存中的数据库显得尤为重要 ...
- 求一个number数组中的最大值和最小值的差
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- java实现HTTPS单向认证&TLS指定加密套件
1.HTTPS介绍 由于HTTP是明文传输,会造成安全隐患,所以在一些特定场景中,必须使用HTTPS协议,简单来说HTTPS=HTTP+SSL/TLS.服务端和客户端的信息传输都是通过TLS进行加密. ...
- 取消a标签的默认行动(跳转到href)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- NSMutableDictionary基本概念
1.NSMutableDictionary 基本概念 什么是NSMutableDictionary NSMutableDictionary是NSDictionary的子类 NSDictionary是不 ...
- js实现网页中英文翻译
1,html 2,metrics.js 3,需要 http://www.microsoftTranslator.com/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKk ...