【Qt】如何保证线程安全(以日志写入为例)

前言

在近日学习中发现,如果开发一个单例模式的日志系统,难免会出现多个线程记录日志的情况,这个时候线程可能导致竞争,或者始料未及的情况发生。

通过学习,如果要保证线程安全,要使用互斥锁QMutex,和QMutexLocker。

根据官方文档对这两个类进行解释:

QMutex:保证一个对象、数据结构或者代码片段在同一时间只有一个线程可以访问。经常和QMutexLocker一起使用,达到自动释放锁的效果。

QMutexLocker:是一个用来简化QMutex加锁和解锁的类。

看了具体解释,现在我来具体使用,假设我有一个Logger.h文件,在下面添加一个QMutex mutex_;

class Logger : public QObject 
{Q_OBJECT
public:void log(LogLevel level, const QString& message); // 假设要这个函数线程安全// ...其他定义private:// 添加这个成员变量。QMutex mutex_;
};

 然后在写入日志的函数开始就加上这么一行,就让写入操作是线程安全的了。如同注释,离开这个作用域,锁会被自动打开。 

void Logger::log(LogLevel level, const QString& message) 
{// 离开这个作用域时自动解锁QMutexLocker locker(&mutex_);//... 写入日志的操作
}

如果不使用QMutexLocker,那么要这样手动加锁和解锁。

void Logger::log(LogLevel level, const QString& message) 
{// 加锁mutex_.lock();//... 写入日志的操作// 解锁mutex_.unlock();
}

如下,大家仔细思考就会发现,万一在写入日志过程中使用了return,函数提前结束,是不是就会出现没有解锁的情况,这肯定是不安全的。所以还是建议QMutex和QMutexLocker一起使用。

void Logger::log(LogLevel level, const QString& message) 
{// 加锁mutex_.lock();//... 写入日志的操作// 假设这里不小心return了,导致没有解锁,出现不安全的情况return;// 解锁mutex_.unlock();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SMMU软件指南之系统架构考虑

安全之安全(security)博客目录导读 目录 5.1 I/O 一致性 5.2 客户端设备 5.2.1 地址大小 5.2.2 缓存 5.3 PCIe 注意事项 5.3.1 点对点通信 5.3.2 No_snoop 5.3.3 ATS 5.4 StreamID 分配 5.5 MSI 本博客介绍与 SMMU 相关的一些系统架构注意事项。 5.1 I/O 一致性 如…

【信息系统项目管理师】【综合知识】【备考知识点】【思维导图】第十一章 项目成本管理

word版☞【信息系统项目管理师】【综合知识】【备考知识点】第十一章 项目成本管理 移动端【思维导图】☞【信息系统项目管理师】【思维导图】第十一章 项目成本管理

九进制转10进制

//第一种 运用循环 public class Main { public static void main(String[] args) { Scanner scan new Scanner(System.in); //在此输入您的代码... int numscan.nextInt(); int result0; int p1; while(num>0) { int nnum%10; resultn*p; numnum/10; pp*9; } System.out.…

计算机毕业设计PyHive+Hadoop深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Java集合框架全面解析:从基本集合到线程安全集合

在Java中,集合(Collection)是用来存储和操作对象的框架,它是Java程序中不可或缺的组件之一。集合框架提供了丰富的数据结构,使数据的存储、查找、插入和删除变得更加高效。在这篇博客中,我们将详细介绍Java…

C++ 复习总结记录二

C 复习总结记录二 主要内容 1、认识面向过程和面向对象 2、类的引入 3、类的定义 4、类的访问限定符及封装 5、类的作用域 6、类的实例化 7、类的对象大小的计算 8、类成员函数的 this 指针 一 认识面向过程和面向对象 C语言是面向过程的,关注的是过程&a…

Mysql运维利器之备份恢复-xtrabackup 安装

1、插件下载 xtrabackup 下载地址 找到自己mysql版本对应得 插件版本下载 2、执行安装命令 yum localinstall percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm 安装完毕!查看版本信息 xtrabackup --version 安装完毕!!!

Java枚举和常量类的区别以及优缺点

枚举(Enum)的深度解析 定义与语法: public enum Color {RED, GREEN, BLUE;private final String hexCode;Color() {// 默认构造函数可以为空,或根据需要初始化。this.hexCode "default";}Color(String hexCode) {thi…

Hoverfly 任意文件读取漏洞(CVE-2024-45388)

漏洞简介 Hoverfly 是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation​ 的 POST 处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而,这一功能可能被攻击者利用来读取 Hoverfly 服务器上的任意文件。尽管…

深入理解 MVCC 与 BufferPool 缓存机制

深入理解 MVCC 与 BufferPool 缓存机制 在 MySQL 数据库中,MVCC(Multi-Version Concurrency Control)多版本并发控制机制和 BufferPool 缓存机制是非常重要的概念,它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用…

Aloudata AIR | 逻辑数据平台的 NoETL 之道

一文为你介绍 Aloudata AIR 逻辑数据平台的技术原理与核心价值 本文主旨是介绍逻辑数据平台的技术原理与核心价值,包含几个部分的内容: 首先,简要阐述逻辑数据平台出现的背景;其次,详细讲解逻辑数据平台的构建方法&am…

C# 设计模式(结构型模式):适配器模式

C# 设计模式(结构型模式):适配器模式 在软件开发中,我们经常会遇到需要将不同接口的组件结合在一起的情况。此时,适配器模式(Adapter Pattern)就派上了用场。它属于结构型设计模式,…

c# CodeFirst生成表字段加注释

前置:ORM框架工具使用的FreeSql 背景:开发环境中运行接口,所有的表字段以及备注会自动加上,但是在测试环境时运行就只生成了表,没有把每个字段的注释加上 问题检查: FreeSql CodeFirst 支持将 c# 代码内的注…

【pyqt】(四)Designer布局

布局 之前我们利用鼠标拖动的控件的时候,发现一些部件很难完成对齐这些工作,pyqt为我们提供的多种布局功能不仅可以让排版更加美观,还能够让界面自适应窗口大小的变化,使得布局美观合理。最常使用的三种布局就是垂直河子布局、水…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio,打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件,将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包,应用的名称…

【HENU】河南大学计院2024 计算机体系结构 期末复习知识点

和光同尘_我的个人主页 一直游到海水变蓝。 体系结构 第一章:计算机系统基础知识计算机系统的实质计算机系统的设计的4个定量原理Amdahl定律CPU性能公式程序的局部性原理: 第二章:指令系统的设计指令系统结构的分类通用寄存器型结构 哈夫曼编码MIPS指令…

计算机网络复习(大题)

📢📢📢传送门 一、简答题(1)五层原理体系结构每层功能:(2)TCP建立连接三次握手过程:(3)访问浏览器的过程:(4)抓…

Git 新手无忧:常用命令与错误解决攻略

Git 常用命令与常见错误解析 在当今的软件开发领域,Git 已经成为了版本控制的事实标准,它帮助开发者们高效地管理项目代码、协同工作以及追踪代码的变更历史。然而,对于新手来说,Git 的众多命令以及可能出现的各种错误会让人有些…

AWS re:Invent 的创新技术

本月早些时候,Amazon 于 12 月 1 日至 5 日在内华达州拉斯维加斯举行了为期 5 天的 re:Invent 大会。如果您从未参加过 re:Invent 会议,那么最能描述它的词是“巨大”——不仅从与会者人数(60,000 人)来看&…

centos双网卡不能上网

双网卡类型 ens33 仅主机 ens34 NAT 问题 window配置一切正常,虚拟机不能上网 解决 方案1:路由引起 查看路由 route结果如下: [rootdata-repository ~]# route Kernel IP routing table Destination Gateway Genmask …