QReadWriteLock线程安全使用案例
时间: 2023-05-26 16:02:04 浏览: 60
下面是一个使用QReadWriteLock实现线程安全的读写数据的案例:
```c++
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <QReadWriteLock>
class Data {
public:
Data() : m_data(0) {}
void write() {
QWriteLocker locker(&m_lock);
++m_data;
}
void read() {
QReadLocker locker(&m_lock);
qDebug() << "Read data:" << m_data;
}
private:
int m_data;
QReadWriteLock m_lock;
};
class WriterThread : public QThread {
public:
WriterThread(Data *data) : m_data(data) {}
void run() {
for (int i = 0; i < 10; ++i) {
m_data->write();
QThread::msleep(100);
}
}
private:
Data *m_data;
};
class ReaderThread : public QThread {
public:
ReaderThread(Data *data) : m_data(data) {}
void run() {
for (int i = 0; i < 10; ++i) {
m_data->read();
QThread::msleep(100);
}
}
private:
Data *m_data;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Data data;
WriterThread writerThread(&data);
ReaderThread readerThread(&data);
writerThread.start();
readerThread.start();
writerThread.wait();
readerThread.wait();
return a.exec();
}
```
这个案例中,我们定义了一个Data类,其中包含一个整型成员变量m_data,以及一个QReadWriteLock类型成员变量m_lock。它有两个公共函数,分别是write和read,write函数加写锁QWriteLocker,然后对m_data进行加1操作;read函数加读锁QReadLocker,然后将m_data的值输出到控制台。
然后我们定义了一个WriterThread类和一个ReaderThread类,分别负责写操作和读操作,它们都接受一个指向Data对象的指针作为构造函数的参数。在run函数中,writerThread调用10次m_data的write函数,readerThread调用10次m_data的read函数。
最后在main函数中,我们创建Data对象、WriterThread对象和ReaderThread对象,然后分别运行它们,并等待它们执行完毕。在输出结果中,我们可以看到写操作和读操作之间是互斥的,且读操作可以被多个线程同时执行。这正是QReadWriteLock实现的功能。