0、说明

QReadWriteLock类提供了读写锁。

读写锁是一种保护那些可以读写的资源的同步工具,如果有多个线程同时要进行读操作,但是有一个线程想要写入,那么所有其他线程都会等待直到这个写线程完成。

在许多情况下,QReadWriteLock是QMutex的竞争者。在读写并发操作不是很频繁时,用QReadWriteLock将是一个很好的选择。

例子

QReadWriteLock lock;

void ReaderThread::run()
{
...
lock.lockForRead();
read_file();
lock.unlock();
...
} void WriterThread::run()
{
...
lock.lockForWrite();
write_file();
lock.unlock();
...
}

为了避免写进程永远被读进程阻塞,当有写进程由于等待而被阻塞时,读进程将不会获得锁,即使现在该锁正在被其他读进程设置。另外,当锁正在被一个写进程设置,此时又有另一个写进程进入时,新的写进程将获得比其他读进程更高的优先级。

就像QMutex那样,QReadWriteLock如果在构造时指定QReadWriteLock::Recursive as QReadWriteLock::RecursionMode,那么允许某个线程多次加锁。这种情况下,调用了多少次lockForWrite() 或 lockForRead(),就要有多少个unlock()。不能在一个线程中同时加读锁和写锁,这两种锁只能先后进行而不能同时进行。

1、模块和加载项

Header: #include <QReadWriteLock>
qmake: QT += core

2、构造

QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive) 用给定recursionMode构造一个QReadWriteLock对象

3、静态字段

enum RecursionMode { Recursive, NonRecursive } 是否允许多次加锁

6、实例方法

返回值类型

方法

说明

void lockForRead() 读锁
void lockForWrite() 写锁
bool

tryLockForRead()

tryLockForRead(int timeout)

尝试加读锁,成功时返回true,如果另一个进程正在写,返回false

尝试加读锁,如果另一个进程正在写,会等待至多timeout毫秒,成功返回true,否则false

bool

tryLockForWrite()

tryLockForWrite(int timeout)

尝试加写锁

尝试加写锁,最多等timeout毫秒

void unlock() 解锁

最新文章

  1. 20155315庄艺霖--对做中学的理解及对c语言和Java的看法
  2. C/C++中数组转换成指针的情况
  3. HDU3157 Crazy Circuits(有源汇流量有上下界网络的最小流)
  4. CodeIgniter 让控制器可以支持多级子目录的 Router 类库
  5. Node.js log4js日志记录
  6. android 四大组件Broadcast Receiver
  7. Memcache应用场景介绍,说明
  8. fedora 20 install skype
  9. (六)backbone - API学习 - Backbone路由
  10. 使用Win32::OLE操作Excel——Excel对象模型
  11. Unity3D Object.DontDestroyOnLoad 备忘
  12. 2 WAN 和1 Evo/3g Routeros PCC 方法负载平衡
  13. 2D 和 3D 中的 CSS 轉換 (Preliminary) CSS3中 translate3D详解
  14. jq获取浏览器的高度
  15. Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用
  16. WebService详解(二)
  17. Vagrant Ansible Playbook 安装一群虚拟机
  18. 解决Android Studio出现Failed to open zip file. Gradle&#39;s dependency cache may be corrupt的问题
  19. 力扣(LeetCode) 14. 最长公共前缀
  20. 20155326 2017-2018-1 《信息安全系统设计基础》课下加分项mypwd实现

热门文章

  1. ubuntu输入正确密码重新跳到登录界面
  2. ES6复习干货知识点汇总
  3. kubernetes之kubeadm 安装kubernetes 高可用集群
  4. BERT-MRC:统一化MRC框架提升NER任务效果
  5. docker镜像制作Dockerfile
  6. 2.flink
  7. 分布式事务框架-Litx补偿事务框架源码解析
  8. Java.lang.Math类详解
  9. SpringBoot源码解读系列三——引导注解
  10. 如何在 pyqt 中实现全局事件总线