QT 读写锁
一、概述
1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。
2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。
3、这种机制可以提高并发性能,因为多个线程可以同时读取共享资源而不会相互干扰。
4、当一个线程有写锁时,其它线程的读锁和写锁请求会被阻塞,直到写锁被释放。
5、QReadWriteLock是Qt框架提供用于线程同步的类,它是一个读写锁(Read-Write Lock)。读写锁允许多个线程同时进行读操作,但在写操作时需要独占访问。
二、使用方法
1、使用写锁
QReadWriteLock lock;//方式一:
lock.lockForWrite();
//这里修改共享资源
lock.unlock();//方式二:
QWriteLocker locker(&lock);
//这里修改共享资源
2、使用读锁
QReadWriteLock lock;//方式一:
lock.lockForRead();
//这里读取共享资源
lock.unlock();//方式二:
QReadLocker locker(&lock);
//这里读取共享资源
三、 QReadWriteLock::RecursionMode
1、Recursive:递归模式,一个线程可以多次锁定同一个读写锁,并且在进行相应数量的unlock()调用之前读写锁不会被解锁。
QReadWriteLock m_lock{ QReadWriteLock::Recursive };
2、NonRecursive:非递归模式,默认值。一个线程只能锁定一个读写锁一次。
QReadWriteLock m_lock{ QReadWriteLock::NonRecursive };
四、常用成员函数
1、void lockForRead()
获取读锁,如果没有其它线程持有写锁,则能够立即获取读锁。如果有其它线程持有写锁,则当前线程会被阻塞,直到写锁被释放。
2、void lockForWrite()
获取写锁,如果没有其它线程持有读锁或写锁,则能狗立即获取写锁。如果有其它线程持有写锁或读锁,则当前线程会被阻塞,直到所有读锁和写锁都被释放。
3、void unlock()
释放读锁或写锁。如果当前线程持有读锁,则释放读锁。如果持有写锁,则释放写锁。尝试解除未锁定的锁是会导致程序终止。
4、bool tryLockForRead()
尝试获取读锁,如果获得了则返回true。如果另一个线程已经锁定写锁,则获取尝试将失败, 但它不会阻塞(与lockForRead()的不同)。
5、bool tryLockForRead(int timeout)
重载函数,如果另一个线程已经获取写锁,则会等待timeout毫秒看是否已经被释放了。
6、bool tryLockForWrite()
尝试获取写锁,如果获得了则返回true,否则立即返回false。如果另一个线程获取了写或读锁,则尝试获取失败。
7、bool tryLockForWrite()
重载函数,如果另一个线程已经获取写或读锁,则等待timeout毫秒看释放已经释放了。
五、示例
// 共享数据变量
QString sharedData;
// 读写锁
QReadWriteLock lock;// 读取操作线程
class ReaderThread : public QThread
{
public:void run() override{QReadLocker locker(&lock);qDebug() << "Read Data: " << sharedData;}
};// 写入操作线程
class WriterThread : public QThread
{
public:void run() override{QWriteLocker locker(&lock);sharedData = "this is my city!";qDebug() << "Write Data: " << sharedData;}
};int main(int argc, char *argv[])
{QApplication a(argc, argv);ReaderThread thread1;WriterThread thread2;thread1.start();thread2.start();thread1.wait();thread2.wait();return a.exec();
}
运行结果:

相关文章:
QT 读写锁
一、概述 1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。 3、这种机制可以提高并发性能&…...
C++ 的时间库之二:Ratio
从现在开始,我们开始介绍 C 风格的时间处理,在这之前,首先要介绍std::ratio。因为 C 的 chrono库中的时间段(duration)定义离不开std::ratio,不了解std::ratio,就很难理解duration的定义。 1 st…...
使用小雅xiaoya/Emby正确的观看电影电视剧的姿势
最近有很多小伙伴来咨询关于小雅Emby全家桶的使用问题,最常见的就是在Emby上搜索出来资源之后,点击播放会提示【播放错误】,当前没有兼容的流。 这可把很多小伙伴给急坏了……于是找到小白咨询。 嗯……怎么说呢?小白并不喜欢看电…...
Java状态机
目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结…...
【Pandas】pandas Series isin
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
通过VSCode直接连接使用 GPT的编程助手
GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条,超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下: 安装VSCODE 直接,官网下载就行 https://code.vis…...
一种最常见的js加密解密
前言 在前端开发的广袤天地中,你是否遭遇过一些看似“乱码”般的代码,根本无从下手理解?这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”,能把原本清晰的代码改头换面。今天,我就来分享如何破解这些被…...
【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
SMOJ 一笔画/洛谷 P7171 COCI 2020/2021 #3 Selotejp 题解
1.一笔画 题意 给出 n 行 m 列的点阵,每个点是一个字符: “.” 或 “#” ,其中“#”表示该点是障碍物。 现在小毛的问题是: 他最少要画多少笔才能把点阵里所有的“.”都覆盖完毕(被小毛画到的点就会被覆盖ÿ…...
【Java学习】继承
一、继承 子类继承父类,子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上,增加上了父类类变量空间的访问权限,此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间,此时子类类变量空间就变成…...
计时器任务实现(保存视频和图像)
下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…...
树莓百度百科能否揭开成都树莓集团的神秘面纱?
树莓百度百科作为大众获取信息的重要渠道,在一定程度上为人们了解树莓集团提供了窗口,但要完全揭开其神秘面纱,仍存在一定局限性。 从树莓百度百科上,我们能获取到关于树莓集团的基本信息,如公司的成立时间、法定代表人…...
【如何看懂数据手册和原理图】
【如何看懂数据手册和原理图】 文章目录 【如何看懂数据手册和原理图】1.数据手册1.1去哪里看?1.2需要注意的 2.支路3.回路4.网孔5.电路定理:基尔霍夫定律**集总参数电路** 抽象理想化5.1基尔霍夫电流定律 (KCL)5.2基尔霍夫电压定律 (KVL)5.3总结 6.读懂…...
SQL 优化工具使用之 explain 详解
一、导读 对于大部分开发人员来说,平常接触的无非就是增删改查这些基本操作,创建存储过程,视图等等都是 DBA 该干的活,但是想要把这些基本操作写的近乎完美也是一件难事。 而 explain 显示了 MySQL 如何使用索引来处理 select 语…...
深度解析Unity3D渲染管线:网格、材质与GPU渲染的协同逻辑
在3D实时渲染领域,网格(Mesh)、材质(Material)和GPU渲染三者构成了虚拟世界的基石。它们如同乐高积木的零件,通过精确的协作,最终在屏幕上呈现出复杂的视觉场景。本文将从技术原理、协作机制到性…...
POI优化Excel录入
57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…...
实时图像与视频超分辨率:高效子像素卷积网络(ESPCN)解析
文章目录 概要理论知识操作实操环境配置基础命令格式:效果示例 概要 超分辨率系列论文阅读卷1:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network PDF网址:https://arxiv.org/…...
QT--对话框的切换
文章目录 前言一、主窗口ui二、创建子窗口三、步骤1.主界面------>子页面2.子界面------>主页面 四、总结 前言 之前我们学了qt中最重要的东西–信号和槽 我们现在实现这样一个demo,程序启动后弹出主界面,点击主界面的按钮弹出子窗口,…...
深入浅出:CUDA是什么,如何利用它进行高效并行计算
在当今这个数据驱动的时代,计算能力的需求日益增加,特别是在深度学习、科学计算和图像处理等领域。为了满足这些需求,NVIDIA推出了CUDA(Compute Unified Device Architecture),这是一种并行计算平台和编程模…...
Zotero PDF Translate插件配置百度翻译api
Zotero PDF Translate插件可以使用几种翻译api,虽然谷歌最好用,但是由于众所周知的原因,不稳定。而cnki有字数限制,有道有时也不行。其他的翻译需要申请密钥。本文以百度为例,进行申请 官方有申请教程: Zot…...
Arm CoreLink GIC-600AE中断控制器架构与编程详解
1. Arm CoreLink GIC-600AE中断控制器架构概述中断控制器是现代嵌入式系统中的关键组件,负责高效管理和分发硬件中断信号。Arm CoreLink GIC-600AE作为一款基于GICv3/v4架构的高性能通用中断控制器,专为多核处理器和异构计算系统设计。其架构设计充分考虑…...
PHP 9.0协程化AI机器人上线仅需72小时:从本地调试到高可用K8s集群的12步军规
更多请点击: https://intelliparadigm.com 第一章:PHP 9.0协程化AI机器人上线仅需72小时:从本地调试到高可用K8s集群的12步军规 PHP 9.0 原生协程引擎(基于 libcoro fibers)与内置 AI 运行时(php-ai-runt…...
NsEmuTools:让NS模拟器管理变得简单高效的跨平台自动化方案
NsEmuTools:让NS模拟器管理变得简单高效的跨平台自动化方案 【免费下载链接】ns-emu-tools 一个用于安装/更新 NS 模拟器的工具 项目地址: https://gitcode.com/gh_mirrors/ns/ns-emu-tools 您是否曾经为了安装和配置NS模拟器而花费数小时?是否在…...
终极二维码修复工具:QRazyBox完整使用指南
终极二维码修复工具:QRazyBox完整使用指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否遇到过这样的情况:重要的二维码因为打印模糊、部分损坏或被污渍覆盖而…...
别再复制粘贴了!教你用Visual Studio 2022封装一个带图片资源的WinForm开关控件库
从零构建高复用WinForm控件库:Visual Studio 2022工程化实践指南 当你在第三个项目中第五次复制那段开关控件代码时,是否意识到自己正在制造技术债务?本文将带你超越简单的代码搬运,用工程化思维构建真正可复用的WinForm控件库。不…...
告别调参玄学:用通俗比喻和Python可视化,理解LQR中Q与R矩阵到底在调什么
告别调参玄学:用生活化比喻和Python可视化理解LQR中的Q与R矩阵 当你第一次打开LQR控制器的代码实现,看到那些神秘的Q和R矩阵参数时,是否感到一头雾水?为什么这个对角元素要设为5.0,而那个要设为0.1?今天&am…...
RISC-V汇编里的“潜规则”:保存寄存器s0-s11和临时寄存器t0-t6到底该怎么用?(附函数调用实例)
RISC-V汇编中的寄存器使用艺术:从规范到实战 在RISC-V架构的开发实践中,寄存器使用规范往往是初学者最容易忽视却又最常踩坑的领域。当你在凌晨三点调试一个随机崩溃的裸机程序时,很可能会发现问题的根源竟是一个未被正确保存的s寄存器或意外…...
面试官最爱问的奇数分频器,我用Verilog从1/3占空比讲到5/18占空比(附完整代码)
从1/3到5/18占空比:奇数分频器的Verilog实现与面试突破指南 在数字IC设计的面试中,手撕代码环节往往是决定成败的关键。而奇数分频器,尤其是非50%占空比的奇数分频器,已经成为各大芯片公司笔试面试中的"必考题"。本文将…...
JTAG与SWD接口对比及2026年主流调试方案
JTAG与SWD接口核心异同对比 JTAG(Joint Test Action Group)和SWD(Serial Wire Debug)是ARM Cortex-M系列及许多现代微控制器最主流的两种片上调试接口。它们都基于IEEE 1149标准族,但设计理念和实现方式有显著差异。 …...
解放STM32的串口潜力:Arduino环境下玩转多串口通信(Serial1/2/3实例化与数据收发实战)
解放STM32的串口潜力:Arduino环境下玩转多串口通信 当你第一次接触STM32时,可能会被它丰富的硬件资源所震撼——尤其是那些看似普通却功能强大的串口。不同于常见的Arduino Uno只有一个硬件串口,STM32系列单片机通常配备2-10个不等的硬件串口…...
