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

QT 读写锁

一、概述

1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。

2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。

3、这种机制可以提高并发性能,因为多个线程可以同时读取共享资源而不会相互干扰。

4、当一个线程有写锁时,其它线程的读锁和写锁请求会被阻塞,直到写锁被释放。

5、QReadWriteLock是Qt框架提供用于线程同步的类,它是一个读写锁(Read-Write Lock)。读写锁允许多个线程同时进行读操作,但在写操作时需要独占访问。

二、使用方法

1、使用写锁

QReadWriteLock lock;//方式一:
lock.lockForWrite();
//这里修改共享资源
lock.unlock();//方式二:
QWriteLocker locker(&lock);
//这里修改共享资源

 2、使用读锁

QReadWriteLock lock;//方式一:
lock.lockForRead();
//这里读取共享资源
lock.unlock();//方式二:
QReadLocker locker(&lock);
//这里读取共享资源

三、 QReadWriteLock::RecursionMode

1、Recursive:递归模式,一个线程可以多次锁定同一个读写锁,并且在进行相应数量的unlock()调用之前读写锁不会被解锁。

QReadWriteLock m_lock{ QReadWriteLock::Recursive };

2、NonRecursive:非递归模式,默认值。一个线程只能锁定一个读写锁一次。

QReadWriteLock m_lock{ QReadWriteLock::NonRecursive };

四、常用成员函数 

1、void lockForRead()

获取读锁,如果没有其它线程持有写锁,则能够立即获取读锁。如果有其它线程持有写锁,则当前线程会被阻塞,直到写锁被释放。

2、void lockForWrite()

获取写锁,如果没有其它线程持有读锁或写锁,则能狗立即获取写锁。如果有其它线程持有写锁或读锁,则当前线程会被阻塞,直到所有读锁和写锁都被释放。

3、void unlock()

 释放读锁或写锁。如果当前线程持有读锁,则释放读锁。如果持有写锁,则释放写锁。尝试解除未锁定的锁是会导致程序终止。

4、bool tryLockForRead()

尝试获取读锁,如果获得了则返回true。如果另一个线程已经锁定写锁,则获取尝试将失败, 但它不会阻塞(与lockForRead()的不同)。

5、bool tryLockForRead(int timeout)

重载函数,如果另一个线程已经获取写锁,则会等待timeout毫秒看是否已经被释放了。 

6、bool tryLockForWrite()

尝试获取写锁,如果获得了则返回true,否则立即返回false。如果另一个线程获取了写或读锁,则尝试获取失败。

7、bool tryLockForWrite()

重载函数,如果另一个线程已经获取写或读锁,则等待timeout毫秒看释放已经释放了。 

五、示例 

// 共享数据变量
QString sharedData;
// 读写锁
QReadWriteLock lock;// 读取操作线程
class ReaderThread : public QThread
{
public:void run() override{QReadLocker locker(&lock);qDebug() << "Read Data: " << sharedData;}
};// 写入操作线程
class WriterThread : public QThread
{
public:void run() override{QWriteLocker locker(&lock);sharedData = "this is my city!";qDebug() << "Write Data: " << sharedData;}
};int main(int argc, char *argv[])
{QApplication a(argc, argv);ReaderThread thread1;WriterThread thread2;thread1.start();thread2.start();thread1.wait();thread2.wait();return a.exec();
}

运行结果:

http://www.lryc.cn/news/539014.html

相关文章:

  • C++ 的时间库之二:Ratio
  • 使用小雅xiaoya/Emby正确的观看电影电视剧的姿势
  • Java状态机
  • 【Pandas】pandas Series isin
  • 通过VSCode直接连接使用 GPT的编程助手
  • 一种最常见的js加密解密
  • 【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析
  • SMOJ 一笔画/洛谷 P7171 COCI 2020/2021 #3 Selotejp 题解
  • 【Java学习】继承
  • 计时器任务实现(保存视频和图像)
  • 树莓百度百科能否揭开成都树莓集团的神秘面纱?
  • 【如何看懂数据手册和原理图】
  • SQL 优化工具使用之 explain 详解
  • 深度解析Unity3D渲染管线:网格、材质与GPU渲染的协同逻辑
  • POI优化Excel录入
  • 实时图像与视频超分辨率:高效子像素卷积网络(ESPCN)解析
  • QT--对话框的切换
  • 深入浅出:CUDA是什么,如何利用它进行高效并行计算
  • Zotero PDF Translate插件配置百度翻译api
  • 利用acme.sh 申请 Google 免费证书
  • 腾讯云cloudstudio使用笔记(一)
  • python自动化制作常规的日报数据可视化
  • C语言:在主函数中输入十个等长的字符串。用另一函数对它们排序,然后在主函数输出这10个已排好序的字符串。
  • 构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
  • SQLMesh 系列教程5- 详解SQL模型
  • 本地DeepSeek模型GGUF文件转换为PyTorch格式
  • Flutter:动态表单(在不确定字段的情况下,生成动态表单)
  • 【Python项目】文本相似度计算系统
  • C# ref 和 out 的使用详解
  • Ubuntu 24.04.1 LTS 本地部署 DeepSeek 私有化知识库