QMutexLocker(比QMutex更简单的让线程安全的方式)

2023-10-27

今天在看别人的代码时,看到了QMutexLocker这个类,一看居然没有解锁的代码,于是就产生了好奇,特此记录一下。

注意:这个类中的所有函数都是线程安全的。

#include <QMutexLocker>

创建:创建的时候就是为下面代码加锁的时候

QMutexLocker ( QMutex * mutex );

为什么要引入QMutexLocker,大家都知道QMutex是为了线程安全而产生的,同理QMutexLocker也是,只是它相对于QMutex要简化了许多,也比较不容易出错。

咋们来看下下面的代码:

QMutex mutex; 
int complexFunction(int flag)
 {
     mutex.lock();

     int retVal = 0;

     switch (flag) {
     case 0:
     case 1:
         mutex.unlock();
         return moreComplexFunction(flag);
     case 2:
         {
             int status = anotherFunction();
             if (status < 0) {
                 mutex.unlock();
                 return -2;
             }
             retVal = status + flag;
         }
         break;
     default:
         if (flag > 10) {
             mutex.unlock();
             return -1;
         }
         break;
     }

     mutex.unlock();
     return retVal;
 }

在每个函数出口的时候都要解锁一遍,这不仅增加了代码的复杂性也增加了发生错误的可能性。

咋们再来看看使用QMutexLocker的时候,有多简单:

QMutex mutex;
int complexFunction(int flag)
 {
     QMutexLocker locker(&mutex);

     int retVal = 0;

     switch (flag) {
     case 0:
     case 1:
         return moreComplexFunction(flag);
     case 2:
         {
             int status = anotherFunction();
             if (status < 0)
                 return -2;
             retVal = status + flag;
         }
         break;
     default:
         if (flag > 10)
             return -1;
         break;
     }

     return retVal;
 }

当QMutexLocker对象被销毁时,互斥锁将始终处于解锁状态。也就是说当这个函数执行完,QMutexLocker就会因为自身的机制解锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QMutexLocker(比QMutex更简单的让线程安全的方式) 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • PTAL1-016 查验身份证 c++实现 多种方法 多种细节

    目录 先上代码 我遇到的问题 首先 对题目的理解 其次 是对代码的优化问题 最后 返回值 多种解法 1 换种数据结构 2 back 函数 3 类 先上代码 include
  • 如何在app store营销之实战技巧(6)

    是的 偶不算程序员 试头像 秀一下业娱作品 第520贴 献给我爱的XXX google docs被墙了 chrome os 2009 iPhone全球技术巡讲 北京站参会确认 邮件收到了 哈哈 恭喜Dr Stone Wars Lite升级啦
  • vue实现给页面添加水印

    第一步 先封装以下文件 创建utils watermark js文件 水印添加方法 let setWatermark str1 str2 gt let id 1 23452384164 123412415 if document getEl
  • 华为机试练习(十)求第K多连续重复子串

    题目描述 给定字符串 str 和正数 K 求出现次数第 k 多的重复的子串 样例输入 AAAAHHHBBCDHHHH 3 样例输出 2 说明 A 4 H 4 H 3 B 2 C 1 D 1 求第3次数多的 本来应该是H 但是由于H在之前已经
  • JS实现注册登录发送短信验证码动态显示60S倒计时完整案例

    通常在web项目中都会遇到账户注册或者忘记密码时需要发送短信验证码的功能 虽然说这种功能很常见 但是实际开发过程中很多人还会遇到不少坑 笔者经过整理把最近项目中的用到的这个发送短信验证码动态显示60S倒计时的完整实现过程分享给广大开发者朋友
  • Spring 整合 MyBatis

    前文介绍了Spring最基本的功能 Spring是一个DI 依赖注入 容器和AOP 面向切面 容器 但这仅仅是手段 远不是目标 Spring的目标是整合与简化其他Java框架的开发 通过DI管理其他框架和组件 利用AOP分离繁复部分 使得复
  • 帮我写个matlab输出扫频信号的代码

    当然 我可以帮你写一个Matlab输出扫频信号的代码 以下是一个简单的例子 定义扫频信号的起始频率 结束频率和时间间隔 f start 0 f end 1000 t step 0 001 生成时间序列 t 0 t step 1 生成扫频信号
  • vue 上传多个文件显示进度条

    组件A中的上传功能
  • docker-compose 安装nacos(单机版本)

    https gitee com yuanshuai likeit nacos docker git cd usr local docker git clone https gitee com yuanshuai likeit nacos d
  • react 图像识别_无法在React中基于URL查找图像

    react 图像识别 If you re new to React and are having trouble accessing images stored locally you re not alone 如果您不熟悉React 并且
  • python+selenium 浏览器无界面模式运行

    以Chrome浏览器为例 方法一 from selenium webdriver import Chrome ChromeOptions opt ChromeOptions 创建Chrome参数对象 opt headless True 把C
  • Redis主从复制时master_link_status:down的问题

    Redis进行主从复制时 在6380端口使用slaveof 127 0 0 1 6379 结果出现master link status down的问题 出现这个情况是由于主机使用有密码 需要在从机的配置文件redis6380 conf加入m
  • [SDOI2017]树点涂色

    洛谷 SDOI2017 树点涂色 题目描述 Bob 有一棵 n n n 个点的有根树 其中 1 1 1 号点是根节点 Bob 在每个点上涂了颜色 并且每个点上的颜色不同 定义一条路径的权值是 这条路径上的点 包括起点和终点 共有多少种不同的
  • linux系统中的用户态和内核态

    linux系统中的用户态和内核态 文章目录 linux系统中的用户态和内核态 TOC 文章目录 定义 一 Linux系统简介 Linux内核结构 二 总结 定义 在Linux系统中 用户态和内核态是两种不同的运行模式 它们主要区别在于程序所
  • ARM-Linux(mini2440)串口与51单片机的9位串口通讯

    ARM Linux mini2440 串口与51单片机的9位串口通讯 2013 03 10 16 09 34 转载 标签 9bit串口 arm linux 51单片机 分类 技术之路 ARM Linux mini2440 串口与51单片机的
  • 日期类(全)

    日期类一般面试的时候都是只给15到25分钟左右的时间来实现 所以要完成必要的几个功能函数 define CRT SECURE NO WARNINGS 1 include
  • clang静态分析器

    补充 centos7 8安装llvm7 https www liangzl com get article detail 20723 html clang 中文 https www bookstack cn read clang llvm
  • STM32学习笔记之按键扫描

    按键扫描的两种模式 1 支持连续扫描模式 连续按下时 会认为有多个数值 比如我们的遥控板 一直按下则频道会一直增加 2 不支持连续模式 连续按下时 仅认为只有一个数值 比如我们的电源按键 长时间的按下并不会一直有效 从而频繁的开关机 就算按
  • 输入FILCO蓝牙键盘的PIN

    平时都是在蓝牙键盘上输入配对码就行 这次要求输入PIN吗 在设备上找半天找不见 其实很简单 在要求输入PIN码的框内用有线键盘输入任意六位数字 如000000 点连接 火速在蓝牙键盘上输入同样的六位 000000 回车 即成功链接 参考 h
  • QMutexLocker(比QMutex更简单的让线程安全的方式)

    今天在看别人的代码时 看到了QMutexLocker这个类 一看居然没有解锁的代码 于是就产生了好奇 特此记录一下 注意 这个类中的所有函数都是线程安全的 include