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() 解锁

Qt:QReadWriteLock的更多相关文章

  1. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  2. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  3. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  4. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  5. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  6. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  7. Qt:正则表达式语法:

         正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式;        Qt 提供了一个Q ...

  8. Qt:QT右键菜单

    Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...

  9. Qt:无标题栏无边框程序的拖动和改变大小

    From: http://blog.csdn.net/kfbyj/article/details/9284923 最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的 ...

随机推荐

  1. linux中yum本地私有仓库安装搭建《全面解析》

    目录 一:yum本地仓库安装 1.yum简介 2.yum安装解析 二:yum安装的生命周期 三:yum私有仓库作用与必要性 四:搭建yum私有仓库 本地版本 1.下载必须的软件包 2.创建软件仓库(就 ...

  2. LVM搭建

    q前提:挂盘,分区.用 fdisk -l 可以查看. 使用 fdisk  /dev/sdb 分区,分区后进行partprobe使分区生效.之后进行 pv,vg,lv 的创建. pvcreate /de ...

  3. httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接 (转)

    PoolingHttpClientConnectionManager是一个HttpClientConnection的连接池,可以为多线程提供并发请求服务.主要作用就是分配连接,回收连接等.同一个rou ...

  4. vue3 最长递增子序列 diff优化

    //vue3优化版(回头我会完善下算法思路) function getSequence(arr) { const p = arr.slice() const result = [0] let i, j ...

  5. Java数组3种创建方式

    public static void main(String[] args){ /** * 1. 固定大小的空数组, 动态创建 */ String[] strArr1 = new String[3]; ...

  6. 【转】 Python生成器generator之next和send运行流程

    原文链接:https://blog.csdn.net/pfm685757/article/details/49924099 对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一 ...

  7. 高德地图定位api以及导航和定位 位置的偏差

    <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.2&key=37 ...

  8. Eclipse 堆栈和内存大小设置(转载)

    1,  设置Eclipse内存使用情况 修改eclipse根目录下的eclipse.ini文件 -vmargs  //虚拟机设置 -Xms40m -Xmx256m -XX:PermSize=128M ...

  9. rtsp监控直播转码用到EasyNVR

    第一 下载EasyNVR_win_v2.6.18.0320 第二 安装启动 第三 配置转码路径 http://localhost:10800/ 最后转码播放 /hls/stream_1/stream_ ...

  10. jdk1.5新特性之-------静态导入

    import java.util.ArrayList; import java.util.Collections; /* jdk1.5新特性之-------静态导入 静态导入的作用: 简化书写. 静态 ...