Qt: QMutex
QMutex
QMutex提供了线程间的顺序访问。
QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。(类似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().
//Thread1很可能被操作系统强制睡眠,允许Thread2运行
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();
}
这样,任何时候就只能有一个线程可以修改数据。这虽是个简单的例子,但是它适用于任何需要按特定频率发生的情况。但你在一个线程中调用lock(),其它线程将会在同一地点试图调用lock()来阻塞,知道这个线程调用unlock()之后其它线程才会获得这个锁。lock()的一种非阻塞选择是tryLock()。
请参考: QMutexLocker, QReadWriteLock, QSemaphore,和QWaitCondition.
成员变量说明
enum QMutex::RecursionMode
QMutex::Recursive:在该模式下,一个线程可以锁住同一互斥量多次,互斥量只有经过相同次的unlock()后才能释放。
QMutex::NonRecursive:在该模式下,一个互斥量只能被锁住一次。
成员函数说明
QMutex::QMutex ( RecursionMode mode = NonRecursive )
构造一个新的互斥量。互斥量创建时的初始状态是解锁状态。如果创建时的模式为QMutex::Recursive,一个线程可以锁住同一互斥量多次,直到互斥量只有经过相同次的unlock()后才能释放。互斥量创建时默认为QMutex::NonRecursive。请参考 lock() 和 unlock().
QMutex::~QMutex ()
销毁一个互斥量。警告:销毁一个处于锁定状态的互斥量将导致不确定的后果。
void QMutex::lock ()
锁定互斥量。如果另一个线程已经锁定该互斥量,那么这次调用将阻塞直到那个线程把它解锁。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数将导致死锁。请参考 unlock().
bool QMutex::tryLock ()
尝试锁定互斥量。如果获得该互斥量,返回true。如果另外的线程已经锁定该互斥量,那么函数立即返回,返回值为false。当互斥量被锁定,必须通过unlock()解锁,这样其他的线程才能锁定该互斥量。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数再次锁定互斥量,函数立即返回,返回值为false。请参考lock() 和 unlock().
bool QMutex::tryLock ( int timeout )
这是tryLock 重载的函数。尝试锁定互斥量。如果获得互斥量,返回true,否则返回false。如果其他线程锁定该互斥量,该函数将等待该互斥量timeout微秒。注意:传递一个负数作为时间参数的话,相当于调用lock()函数。当互斥量被锁定,必须通过unlock()解锁,这样其他的线程才能锁定该互斥量。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数再次锁定互斥量,函数立即返回,返回值为false。请参考 lock() 和 unlock().
void QMutex::unlock ()
释放互斥量。如果在不是持有该互斥量的线程中调用unlock(),将导致一个错误。
释放一个未被锁定的互斥量将导致一个不确定的后果。请参考 lock().
Qt: QMutex相关推荐
- Qt 互斥锁 QMutex 的简单应用
Qt 互斥锁 QMutex 的简单应用 在多线程解决问题中,经常会碰到多个线程操作同一片资源,有些时候用信号量的方式去处理,但有的时候需要用到互斥锁. 互斥锁:说白了就是,资源某个时间只能被一个线程使 ...
- Qt 互斥量 QMutex
QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...
- 【Qt 5】Qt中QMutex的一点理解
在Qt的多线程控制中,互斥量的访问最简单的控制是添加一个mutex锁,对一个函数或者变量锁定. 一直不理解QMutex中的锁是如何运行的,或者说如何利用这个锁将变量进行锁定.官方实例是这样的: 1 Q ...
- QT的QMutex类的使用
详细说明 QMutex类提供线程之间的访问序列化. QMutex的目的是保护对象,数据结构或代码段,以便一次只能有一个线程可以访问它(这类似于Java sync关键字).通常最好将互斥锁与QMutex ...
- Qt多线程之QMutex
QMutex类提供的是线程之间的访问顺序化. QMutex的目的是保护一个对象.数据结构或者代码段,所以同一时间只有一个线程可以访问它.(在Java术语中,它和同步关键字"synchroni ...
- Qt自作聪明对QMutex初始化导致出现问题this application has requested the runtime to terminate it in an unusual way
我在Linux下编写好的程序编译运行都没有问题,但是关掉程序后会在Application Output里提示The program has unexpectedly finished.以为是一些内存没 ...
- Qt中使用多线程的一些心得(一)——继承QThread的多线程使用方法
一 前言 二Qt多线程方法一 继承QThread 2.1使用多线程的原因分析 2.2 写一个继承于QThread的线程 三 总结 一 前言 本篇文章部分内容参考了该博文:传送门. Qt中有两种 ...
- 11.QT事件机制源码时序分析(下)
接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109182406,本文继续解析QCoreApplication::sendEvent和Q ...
- Qt中多线程间的互斥
文章目录 1 多线程间的互斥 1.1 生产消费者问题 1.2 QMutex 1.3 死锁问题 1.4 信号量 1 多线程间的互斥 值得思考的问题: 多个线程间除了在时序上可能产生依赖,在其它方面是否也 ...
最新文章
- Spring Cloud Config对特殊字符加密的处理
- python中index从列表中查_在Python中查找包含它的列表的项目的索引
- Office 365:如何管理Office 365中的Ophaned Mailbox
- java 弹出下载_java如何实现下载弹出的对话框
- 正余弦函数的Talor近似
- C/C++中的常量指针与指针常量
- phpcms 添加稿件到栏目 add_content
- 几何修复_*ST海润:实施终止退市 光伏产业修复成几何?
- JDBC(实现增删改查的通用操作)
- 价值5000元的报表分享
- 操作系统复习笔记(一)
- COMSOL随机裂缝生成
- 安卓手机格式化后怎么恢复
- 神技 破解EXCEL工作表保护密码
- DWG中注记类型属性转换
- JavaScript点击图片加上红色边框
- css实现文字逐个显示
- java工作空间报错,java更改工作空间后报错
- Tomcat 环境变量配置
- Java岗大厂面试百日冲刺【Day50】— 秒杀系统2 (日积月累,每日三题)