大概说一下用法,例子:

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();
}

用法大概可以总结为这样:

QMutex mutex;

void method() {
mutex.lock();
// 你要做的骚操作
mutex.unlock()
}

作用:确保同一时间只有一个线程可以运行lockunlock之间的内容。

其实这就是一个互斥锁,经常用的地方是在访问资源并作出修改的时候。这时候我们不希望有别的线程来同时访问同一个资源,所以会给两个线程要访问资源的地方的代码加上互斥锁,这样只有一个线程访问完资源处理完并unlock后,另一个线程才可以继续执行。所以可以看到,QMutexlock其实是阻塞式的,如果不能够取得锁那么没有办法继续往下执行。如果想要弄成非阻塞式的,那么就要用tryLock,并设置超时时长。但是这个就不展开说了。

例如,同时访问一个全局变量number

int number = 6;

void method1()
{
number *= 5;
number /= 4;
} void method2()
{
number *= 3;
number /= 2;
}

method1method2分别是由两个线程运行,正常情况下,我们的执行顺序应该是这样的:

// 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

所以我们需要加上互斥锁,确保当前只有一个进程访问变量number(可以看作是资源,其实原理都差不多):

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();
}

这样就可以确保只有一个线程完成了任务之后并且释放掉互斥锁之后,另一个线程才开始运行,保证了线程的完整运行和正确结果。

此外,可以通过成员函数bool QMutex::locked ()来确定一个互斥量有没有被lock。如果已经被锁定了返回true,否则返回false

参考

QMutex Class

QMutex使用详解

关于Qt中的QMutex——关于lock与unlock的更多相关文章

  1. Qt中sleep()的实现(耳目一新的两种方法)

    在Qt中并没有Sleep函数可以调用,在程序编写时往往需要休眠几秒,这里举出两个方法,不知道是否啥不良隐患没~~ 方法一: class SleeperThread : public QThread{p ...

  2. Qt入门(9)——Qt中的线程支持

    Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...

  3. Qt中暂停线程的执行(主线程和工作线程共用一把锁,一旦主线程将它锁上,工作线程就无法运行了,这也是一个办法)

    在线程中定义一个信号量: QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住:   void run()   {   while(1)   {   pause.lock ...

  4. 解析Qt中QThread使用方法

    本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...

  5. qt中线程的使用方法

    QT中使用线程可以提高工作效率. 要使用线程要经过一下四个步骤: (1)先创建一个c++ class文件,记得继承Thread,创建步骤如下: a.第一步 b.第二步 (2)自定义一个run函数,以后 ...

  6. Qt中(图片)资源的使用方式

    Qt中使用图片资源的方法有很多种,以前我一直分不清各种之间的区别和Qt相应的处理机制,后来遇到一些实际的问题,然后再加上查阅源码和资料,总算弄明白一些事情,但是本文仅仅是个人理解,如有错误之处请告诉我 ...

  7. QT中实现应用程序的单例化

    一介绍 通过编写一个QSingleApplication类,来实现Qt程序的单例化,原文的作者是在Windows Vista + Qt4.4 下实现的,不过应用在其他平台上是没问题的.(本文是我在ht ...

  8. 用事件队列解决GUI的操作顺序问题(Qt中处理方法)

    GUI操作顺序问题引发异常: 有时候我们使用写GUI程序的时候会遇到这样的问题:比如在程序中,建立了一个列表的GUI.这个列表是随着时间不断更新的,而且操作也会读取这个列表GUI的内容. 如果这个程序 ...

  9. Qt中(图片)资源的三种使用方式

    Qt中使用图片资源的方法有很多种,以前我一直分不清各种之间的区别和Qt相应的处理机制,后来遇到一些实际的问题,然后再加上查阅源码和资料,总算弄明白一些事情,但是本文仅仅是个人理解,如有错误之处请告诉我 ...

随机推荐

  1. 微信小程序 点击事件 传递参数

    wxml: data-参数名="值" bindtap="函数名" <view class="buy-button {{cap_select == ...

  2. tomcat 搭建网站

    基本概念 JDK(Java Development Kit)是Sun Microsystems针对Java开发人员的产品.自从Java推出以来,JDK已经成为使用最广泛的Java SDK.JDK 是整 ...

  3. 【51nod1672】区间交

    题目大意:给定一个长度为 N 的序列,以及 M 个区间,现从中选出 K 个区间,使得这些区间的交集区间的点权和最大,求最大值是多少. 题解: 发现直接选 K 个区间不可做,考虑从答案入手.设答案区间为 ...

  4. 【洛谷P1450】硬币购物

    题目大意:给定 4 种面值的硬币和相应的个数,求购买 S 元商品的方案数是多少. 题解: 考虑没有硬币个数的限制的话,购买 S 元商品的方案数是多少,这个问题可以采用完全背包进行预处理. 再考虑容斥, ...

  5. C#制作的屏幕取色器

    1 using System;  2 using System.Collections.Generic;  3 using System.ComponentModel;  4 using System ...

  6. [Linux系统] (4)脚本编程

    一.bash shell 可以理解为一种解释器和启动器,解释命令文本,并执行命令. 命令来源: 用户交互输入 文本文件输入 1.示例,写一个最简单的文本 vi test.txt 写入以下内容: ech ...

  7. 1、Qt应用程序

    新建Qt Widgets Application,基类选择QWidget Qt项目特点(参考上图):头文件名与类名一样,成对出现 main.cpp代码解释如下 #include "mywid ...

  8. CF contest 1216 Div3. F

    题目链接:Click here Solution: 看起来是贪心,其实不然... 我们定义\(f[i]\)表示仅覆盖\(1\sim i\)所需要的最小代价,那么对\(i\)为0的点来说,易得\(f[i ...

  9. ubuntu下jps命令无效

    jps命令无效 #启动zookeeper $ sudo ./zkServer.sh start [sudo] jjboom 的密码: ZooKeeper JMX enabled by default ...

  10. QTableWidgetItem QTreeWidgwtItem 复选框的取消显示方法

    思路: QTableWidgetItem   :item->setData(Qt::CheckStateRole,QVariant()); QTreeWidgwtItem  :item-> ...