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相关推荐

  1. Qt 互斥锁 QMutex 的简单应用

    Qt 互斥锁 QMutex 的简单应用 在多线程解决问题中,经常会碰到多个线程操作同一片资源,有些时候用信号量的方式去处理,但有的时候需要用到互斥锁. 互斥锁:说白了就是,资源某个时间只能被一个线程使 ...

  2. Qt 互斥量 QMutex

    QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...

  3. 【Qt 5】Qt中QMutex的一点理解

    在Qt的多线程控制中,互斥量的访问最简单的控制是添加一个mutex锁,对一个函数或者变量锁定. 一直不理解QMutex中的锁是如何运行的,或者说如何利用这个锁将变量进行锁定.官方实例是这样的: 1 Q ...

  4. QT的QMutex类的使用

    详细说明 QMutex类提供线程之间的访问序列化. QMutex的目的是保护对象,数据结构或代码段,以便一次只能有一个线程可以访问它(这类似于Java sync关键字).通常最好将互斥锁与QMutex ...

  5. Qt多线程之QMutex

    QMutex类提供的是线程之间的访问顺序化. QMutex的目的是保护一个对象.数据结构或者代码段,所以同一时间只有一个线程可以访问它.(在Java术语中,它和同步关键字"synchroni ...

  6. Qt自作聪明对QMutex初始化导致出现问题this application has requested the runtime to terminate it in an unusual way

    我在Linux下编写好的程序编译运行都没有问题,但是关掉程序后会在Application Output里提示The program has unexpectedly finished.以为是一些内存没 ...

  7. Qt中使用多线程的一些心得(一)——继承QThread的多线程使用方法

    一 前言 二Qt多线程方法一 继承QThread 2.1使用多线程的原因分析 2.2 写一个继承于QThread的线程 三 总结 一 前言   本篇文章部分内容参考了该博文:传送门.   Qt中有两种 ...

  8. 11.QT事件机制源码时序分析(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109182406,本文继续解析QCoreApplication::sendEvent和Q ...

  9. Qt中多线程间的互斥

    文章目录 1 多线程间的互斥 1.1 生产消费者问题 1.2 QMutex 1.3 死锁问题 1.4 信号量 1 多线程间的互斥 值得思考的问题: 多个线程间除了在时序上可能产生依赖,在其它方面是否也 ...

最新文章

  1. Spring Cloud Config对特殊字符加密的处理
  2. python中index从列表中查_在Python中查找包含它的列表的项目的索引
  3. Office 365:如何管理Office 365中的Ophaned Mailbox
  4. java 弹出下载_java如何实现下载弹出的对话框
  5. 正余弦函数的Talor近似
  6. C/C++中的常量指针与指针常量
  7. phpcms 添加稿件到栏目 add_content
  8. 几何修复_*ST海润:实施终止退市 光伏产业修复成几何?
  9. JDBC(实现增删改查的通用操作)
  10. 价值5000元的报表分享
  11. 操作系统复习笔记(一)
  12. COMSOL随机裂缝生成
  13. 安卓手机格式化后怎么恢复
  14. 神技 破解EXCEL工作表保护密码
  15. DWG中注记类型属性转换
  16. JavaScript点击图片加上红色边框
  17. css实现文字逐个显示
  18. java工作空间报错,java更改工作空间后报错
  19. Tomcat 环境变量配置
  20. Java岗大厂面试百日冲刺【Day50】— 秒杀系统2 (日积月累,每日三题)

热门文章

  1. 记录一下很好用的java爬虫代码-很有意思,原理也很简单,一看就懂
  2. volatile和synchronized关键字
  3. spring MVC 及 AOP 原理
  4. Windows下android模拟器环境搭建
  5. codevs 1145 Hanoi双塔问题 2007年NOIP全国联赛普及组
  6. MongoDB副本集配置系列二:配置MongoDB副本集
  7. webmagic框架
  8. 移动前端的一些必备知识
  9. 在线文本差集计算工具
  10. AQS同步队列结构分析