当前位置: 首页 > news >正文

面试问题详解十三:Qt 多线程同步【QReadWriteLock】讲解

在 Qt 多线程开发中,合理使用同步机制可以大大提升程序的性能与可靠性。今天我们学习一个非常实用的同步工具:QReadWriteLock。它在读多写少的场景中表现尤为出色。


🔍 什么是 QReadWriteLock?

QReadWriteLock 是 Qt 提供的一种读写锁机制,用于解决多线程环境下的资源共享冲突问题。

QMutex 不同的是:

功能QMutexQReadWriteLock
支持多个读线程并发
写时独占
性能优势通用锁读多写少场景表现更优

✨ 应用场景

适用于以下典型场景:

  • 配置读取器:多个线程频繁读取配置,仅偶尔有线程写入。
  • 缓存系统:多个线程读取缓存数据,只有后台线程更新数据。
  • 数据库连接池管理器:获取连接时允许并发读,释放连接时需要写锁。

🧱 项目结构设计

为了保证结构清晰、易于维护,我们将代码按功能模块进行分离:

your_project/
│
├── main.cpp                // 应用入口
├── shareddata.h/.cpp       // 共享数据类(含读写锁)
├── readerthread.h/.cpp     // 读线程类
└── writerthread.h/.cpp     // 写线程类

📄 模块代码详解

shareddata.h

#ifndef SHAREDDATA_H
#define SHAREDDATA_H#include <QString>
#include <QReadWriteLock>class SharedData {
public:void readData();void writeData(const QString& newData);private:QString data = "默认值";QReadWriteLock lock;
};#endif // SHAREDDATA_H

shareddata.cpp

#include "shareddata.h"
#include <QThread>
#include <QDebug>void SharedData::readData() {lock.lockForRead();qDebug() << QThread::currentThread() << "正在读取数据:" << data;QThread::msleep(100);lock.unlock();
}void SharedData::writeData(const QString& newData) {lock.lockForWrite();qDebug() << QThread::currentThread() << "正在写入数据:" << newData;data = newData;QThread::msleep(200);lock.unlock();
}

readerthread.h

#ifndef READERTHREAD_H
#define READERTHREAD_H#include <QThread>
#include "shareddata.h"class ReaderThread : public QThread {
public:ReaderThread(SharedData* d);void run() override;private:SharedData* data;
};#endif // READERTHREAD_H

readerthread.cpp

#include "readerthread.h"ReaderThread::ReaderThread(SharedData* d): data(d) {}void ReaderThread::run() {for (int i = 0; i < 3; ++i) {data->readData();}
}

writerthread.h

#ifndef WRITERTHREAD_H
#define WRITERTHREAD_H#include <QThread>
#include "shareddata.h"class WriterThread : public QThread {
public:WriterThread(SharedData* d);void run() override;private:SharedData* data;
};#endif // WRITERTHREAD_H

writerthread.cpp

#include "writerthread.h"WriterThread::WriterThread(SharedData* d): data(d) {}void WriterThread::run() {for (int i = 0; i < 2; ++i) {QString val = QString("新值 %1").arg(i);data->writeData(val);}
}

main.cpp

#include <QCoreApplication>
#include "shareddata.h"
#include "readerthread.h"
#include "writerthread.h"int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);SharedData shared;ReaderThread reader1(&shared);ReaderThread reader2(&shared);WriterThread writer(&shared);reader1.start();reader2.start();writer.start();reader1.wait();reader2.wait();writer.wait();return 0;
}

🧪 运行结果预览(输出示例)

QThread(0x7fabc...) 正在读取数据: "默认值"
QThread(0x7facd...) 正在读取数据: "默认值"
QThread(0x7fade...) 正在写入数据: "新值 0"
QThread(0x7fabc...) 正在读取数据: "新值 0"
...

你可以观察到多个读线程是可以并行工作的,而写操作具有独占性。


✅ 总结

  • QReadWriteLock 是 Qt 提供的轻量级读写锁。
  • 读操作可以并发执行,写操作是独占的。
  • 适合优化读多写少的线程安全场景。
  • 使用模块化结构管理代码,有助于维护和扩展。

http://www.dtcms.com/a/360094.html

相关文章:

  • Qt-Advanced-Docking-System: 一个基于 Qt 框架的高级停靠窗口系统
  • Qt libcurl的下载、配置及简单测试 (windows环境)
  • 没有广告,纯净好用,功能强大的本地和网络文件管理器
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day12
  • RocketMQ5.0+保姆级单点Docker部署教程
  • 从零构建中间件:Tower 核心设计的来龙去脉
  • 当代科学(范畴大辩论) 的学科分科(论据)的要素论(论点)及方法论(论证):边缘处理
  • return 语句使用指南(c++)
  • 基于 YOLOv11n 的无人机航拍小目标检测算法学习
  • shell脚本第六阶段---三剑客之sed
  • Spring Cloud Alibaba Seata 分布式事务(六)
  • CPTS---Hospital
  • AliceVision相比于OpenMVG、Colmap有什么区别和特点
  • 计算机毕设选题:基于Python+Django实现电商评论情感分析系统
  • 嵌入式ARM程序高级调试技能:20.qemu arm ARM Linux 上 addr2line 的实际应用示例
  • 常用定位技术对比解析
  • OpenCL C 命令队列
  • 点接触混合润滑完整数值解
  • Photoshop - Ps 标尺
  • PortSwigger靶场之DOM XSS in document.write sink using source location.search通关秘籍
  • [ Android Audio 篇 ] 高通平台 Android AudioRecord 多通道录音
  • 手写call函数【JavaScript】
  • Java多线程基础:进程、线程与线程安全实战
  • 《信息学奥林匹克辞典》中的一个谬误
  • 【Android】Notification 的基本使用
  • C++ 快速复习指南(上半部分)
  • 房屋租赁系统|基于SpringBoot和Vue的房屋租赁系统(源码+数据库+文档)
  • 8.31【Q】CXL-DMSim:
  • 数学分析原理答案——第七章 习题12
  • 设置Ubuntu 22.04 LTS上的rsync同步服务