面试问题详解十三:Qt 多线程同步【QReadWriteLock】讲解
在 Qt 多线程开发中,合理使用同步机制可以大大提升程序的性能与可靠性。今天我们学习一个非常实用的同步工具:QReadWriteLock
。它在读多写少的场景中表现尤为出色。
🔍 什么是 QReadWriteLock?
QReadWriteLock
是 Qt 提供的一种读写锁机制,用于解决多线程环境下的资源共享冲突问题。
与 QMutex
不同的是:
功能 | QMutex | QReadWriteLock |
---|---|---|
支持多个读线程并发 | ❌ | ✅ |
写时独占 | ✅ | ✅ |
性能优势 | 通用锁 | 读多写少场景表现更优 |
✨ 应用场景
适用于以下典型场景:
- 配置读取器:多个线程频繁读取配置,仅偶尔有线程写入。
- 缓存系统:多个线程读取缓存数据,只有后台线程更新数据。
- 数据库连接池管理器:获取连接时允许并发读,释放连接时需要写锁。
🧱 项目结构设计
为了保证结构清晰、易于维护,我们将代码按功能模块进行分离:
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 提供的轻量级读写锁。- 读操作可以并发执行,写操作是独占的。
- 适合优化读多写少的线程安全场景。
- 使用模块化结构管理代码,有助于维护和扩展。