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更简单的让线程安全的方式) 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • Dapper 在执行时挂起

    我有一个 IDb连接 sql UPDATE 表名 SET json json lastupdate SYSDATE WHERE id id var param new DynamicParameters param Add json jso
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 如何让XmlReader读取C#中的属性?

    我有一个 XML Stream 其中包含以下 XML 内容
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int

随机推荐

  • 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