当前位置: 首页 > 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.xdnf.cn/news/1413343.html

相关文章:

  • 24数学建模国赛C
  • 【数据分享】上市公司-国际化程度-营业收入指标(2005-2023)
  • Linux软件升级方法总结
  • (树)Leetcode94二叉树的中序遍历
  • RK3568平台开发系列讲解:瑞芯微平台4G模块篇移植
  • Java 类加载器解析
  • macos自动安装emsdk4.0.13脚本
  • 【开题答辩全过程】以 家庭理财管理系统的设计与实现为例,包含答辩的问题和答案
  • Playwright 中Codegen的优点与局限性分析
  • a3002盘式制动器刹车cad➕三维图➕设计说明书
  • flutter工程
  • kkfileview自建cdn引入
  • 血缘元数据采集开放标准:OpenLineage Integrations Compatibility Tests Structure
  • 利用 Java 爬虫获取淘宝拍立淘 API 接口数据的实战指南
  • 基于VS平台的QT开发全流程指南
  • 蓝牙AOA助力智慧仓储管理系统
  • MongoDB 从零到入门:实用指南
  • OSWatcher安装和使用(简化版)
  • 其他八股总结
  • Day 01(01): Hadoop与大数据基石
  • LabVIEW电力系统自动化仿真实验教学系统
  • 掩码语言模型(Masked Language Model, MLM)
  • ES集群部署-EFK架构实战
  • 第十八章 ESP32S3 HW_PWM 实验
  • 基于springboot的摄影器材租赁回收系统
  • Docker 容器(二)
  • 大模型面试题剖析:PPO 与 GRPO 强化学习算法核心差异解析
  • 大模型应用总结
  • shell编程之shell脚本基础(未完待续)
  • 飞牛Docker部署免费frp内网穿透