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 ...
随机推荐
- jsp加载css失效的解决方法
问题: 有时候大家修改了css文件里的样式,但是刷新浏览器,利用工具看样式的时候,发现样式根本没加载或者说没更新, 其实这出现的问题就是缓存的问题 解决: 如何避免发生这种事,其实很简单,只需要每次请 ...
- MySQL数据类型操作(char与varchar)
目录 一:MySQL数据类型之整型 1.整型 2.验证不同类型的int是否会空出一个存储正负号 3.增加约束条件 去除正负号(unsigned) 二:浮点型 1.浮点型 2.验证浮点型精确度 三:字符 ...
- Kubernetes的Controller进阶(十二)
一.Controller 既然学习了Pod进阶,对于管理Pod的Controller肯定也要进阶一下,之前我们已经学习过的Controller有RC.RS和Deployment,除此之外还有吗,如果感 ...
- java解洛谷P1003铺地毯问题
此题给出的最大地毯数量为10000,创建[10001][4]长度的二维数组 以稀松数组的方法,[第i个地毯]的 [0][1][2][3]分别保存地毯的坐标和大小 再用需要求的坐标比较即可 public ...
- Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询
创建表 # models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的 ...
- 如何在 pyqt 中解决国际化 tr() 函数不起作用的问题
前言 有些时候我们在父类中使用了 self.tr('XXX'),使用 Qt Linguist 完成翻译并导出 qm 文件后,发现子类中仍然是英文原文.比如下面这段代码: class AlbumCard ...
- 前后端数据json交换的问题
问题1:前端发送给后端数据了,后端也接收到了,后端同时返回数据给前端了,但是前端的ajax请求中的success(data){}中的方法不执行 解决:排查了很多问题,结果都一一排除了,最后发现后端发送 ...
- C语言中数组长度不能用变量定义吗?
C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数.没有申请的空间系统是不允许读写的.那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小 ...
- bom案例2-弹出层
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 利用纯代码写出一个秒表表盘的方法 —— #DF
@interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...