文章目录
一、读写锁验证示例图
- 一、读写锁验证示例图
- 二、读写锁、QReadWriteLock(个人理解)
- 三、源码
- 3.1 CThread(读写锁使用类)
- 3.2 CMainWindow(线程调用类)
- 总结
- 相关文章
下图为Qt读写锁的演示及验证,在下图中可以看出两个读取数据的函数会一起调用(代表读写锁支持读取锁线程一起运行),且数据操函数并不会调用;而当数据操作函数调用时,两个数据读取函数也不会调用。由此可知,当读取锁开启时,写入锁不能进入,反之亦然。源码在本文第三节(源码含详细注释)。 提示:不会使用Qt设计师设计界面的小伙伴点击这里。
当有多个线程使用同一块数据且其中部分线程不会对数据做出改变时(多个线程使用同一个锁)。如果使用QMutex实现,同一时间,只能有一个线程可以运行,这样的话会影响效率。 理论上说,那部分不会对数据做出改变的线程可以同时运行;因此,读写锁出现了,当读取锁开启时并不影响其他使用读取锁的线程,可以一起运行,只是写入锁不能进入;但当写入锁开启时,其他线程就只有等待当前开启写入锁的线程解锁才能运行。
三、源码 3.1 CThread(读写锁使用类)CThread.h
#ifndef CTHREAD_H
#define CTHREAD_H
#include
#include
#include
class CThread : public QThread
{
Q_OBJECT
public:
explicit CThread(QObject *parent = nullptr);
~CThread();
void run();
void setFlag(char flag);
void readFunc1(); //读取操作1函数
void readFunc2(); //读取操作2函数
void writeFunc(); //数据操作函数
private:
static QReadWriteLock *m_sLock; //定义静态读写锁(方便所有当前线程类对象使用)
char m_flag; //定义char变量存储当前线程的字符
};
#endif // CTHREAD_H
CThread.cpp
#include "CThread.h"
#include
#include
QReadWriteLock * CThread::m_sLock = new QReadWriteLock; //为静态变量new出对象
CThread::CThread(QObject *parent)
: QThread(parent)
{
}
CThread::~CThread()
{
}
void CThread::run()
{
int i = 0;
//循环输出当前标识符4次
while(i++ != 4)
{
if(0 == m_flag)
{
//写入锁上锁
m_sLock->lockForWrite();
writeFunc(); //数据操作的内容
m_sLock->unlock(); //解锁
}
else if(1 == m_flag)
{
//读取锁上锁
m_sLock->lockForRead();
readFunc1(); //数据读取的内容
m_sLock->unlock(); //解锁
}
else
{
//读取锁上锁
m_sLock->lockForRead();
readFunc2(); //数据读取的内容
m_sLock->unlock(); //解锁
}
}
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?