QReadWriteLock的学习

参考:

Qt线程的简单使用--QReadWriteLock的用法_qt的读写锁怎么应用-CSDN博客

应用场景:多个线程同时进行读操作。

比如:100个线程进行读操作,1个线程进行写操作。

示例1:

#include <QObject>
#include <QThread>
class Read_thread : public QThread
{Q_OBJECT
public:explicit Read_thread(QObject *parent = nullptr);
protected:void run();
};class Write_thread : public QThread
{Q_OBJECT
public:explicit Write_thread(QObject *parent = nullptr);
protected:void run();
};
#include <QReadWriteLock>
int counter=0;
QReadWriteLock lock;void Read_thread::run()
{lock.lockForRead();for(int i=0;i<5;i++){this->msleep(10);qDebug()<<"Read_thread:"<<QThread::currentThreadId()<<"   "<<counter;}lock.unlock();
}
void Write_thread::run()
{lock.lockForWrite();for(int i=0;i<5;i++){counter++;this->msleep(10);qDebug()<<"Write_thread:"<<QThread::currentThreadId()<<"   "<<counter;}lock.unlock();
}
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);qDebug()<<"main:"<<QThread::currentThreadId();connect(this,SIGNAL(destroyed()),this,SLOT(quitThreadSlot()));t=new Read_thread(this);t->start();t1=new Read_thread(this);t1->start();t2=new Write_thread(this);t2->start();t3=new Write_thread(this);t3->start();
}void Widget::quitThreadSlot()
{t1->quit();t1->wait();t->quit();t->wait();t2->quit();t2->wait();t3->quit();t3->wait();
}

输出结果:

main: 0x5a08

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Read_thread: 0x62d8 0

Read_thread: 0x4f30 0

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Read_thread: 0x4f30 0

Read_thread: 0x62d8 0

Write_thread: 0x339c 1

Write_thread: 0x339c 2

Write_thread: 0x339c 3

Write_thread: 0x339c 4

Write_thread: 0x339c 5

Write_thread: 0x60b0 6

Write_thread: 0x60b0 7

Write_thread: 0x60b0 8

Write_thread: 0x60b0 9

Write_thread: 0x60b0 10

分析结果:

可以看到,允许不同的线程同时读counter,这里就是在交替地读counter,

之后进行写操作,不是交替进行的,

而是先执行Write_thread: 0x339c,

再执行Write_thread: 0x60b0。

即:可以同时读,不可以同时写。

 示例2:修改部分代码:

    t=new Read_thread(this);t->start();QThread::msleep(1000);t2=new Write_thread(this);t2->start();t3=new Write_thread(this);t3->start();t1=new Read_thread(this);t1->start();

输出结果:

main: 0x5c84

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Read_thread: 0xb60 0

Write_thread: 0x3aa0 1

Write_thread: 0x3aa0 2

Write_thread: 0x3aa0 3

Write_thread: 0x3aa0 4

Write_thread: 0x3aa0 5

Write_thread: 0x4788 6

Write_thread: 0x4788 7

Write_thread: 0x4788 8

Write_thread: 0x4788 9

Write_thread: 0x4788 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

Read_thread: 0x38b0 10

分析:Read_thread: 0xb60先进行读操作

主线程阻塞1s

Write_thread: 0x3aa0进行写操作

Write_thread:0x4788进行写操作

Read_thread: 0x38b0进行读操作

示例3:QReadLocker和QWriteLocker的使用

void Read_thread::run()
{QReadLocker locker(&lock);for(int i=0;i<5;i++){this->msleep(10);qDebug()<<"Read_thread:"<<QThread::currentThreadId()<<"   "<<counter;}
}
void Write_thread::run()
{QWriteLocker locker(&lock);for(int i=0;i<5;i++){counter++;this->msleep(10);qDebug()<<"Write_thread:"<<QThread::currentThreadId()<<"   "<<counter;}
}

 这样写只是更简单了一些,不需要再locked(),unlocked()了。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wiadefui.dll文件丢失导致程序无法运行,怎么办?文件下载

很多用户在启动游戏或扫描仪的时候&#xff0c;电脑会报错提示“wiadefui.dll文件找到不到&#xff0c;程序无法启动”&#xff0c;这是怎么回事呢&#xff1f; 首先&#xff0c;我们先来了解wiadefui.dll文件是什么&#xff1f;有什么作用&#xff1f; wiadefui.dll是Windows…

L1-032 Left-pad(Java)

根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块&a…

对docker的一些粗略理解

what-什么是docker&#xff1f;&#xff08;建议在Linux上安装&#xff0c;win11自带有linux系统&#xff0c;但是我试过在上面安装不太灵活&#xff09; 关键词&#xff1a;容器/盒子/大房子 Docker 是一种开源平台&#xff0c;用于轻松部署、运行和管理应用程序的容器化技术。…

渗透测试-靶机DC-2-知识点总结

靶机DC-2-知识点总结 一、前言二、实验环境三、渗透测试工具1. cewl&#xff08;1&#xff09;cewl简介&#xff08;2&#xff09;cewl常见用法 2. wpscan&#xff08;1&#xff09;wpscan简介&#xff08;2&#xff09;wpscan常见用法<1>直接扫描<2>-e u爆破用户名…

Elasticsearch各种高级文档操作2

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符&#xff0c;它的作用是指明一个标识符&#xff08;变量、函数或类&#xff09;来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量&#xff0c;2.再搜索全局变量&#xff0c;3.最后搜索指定的命名空间域 三、…

回调函数和钩子函数的区别

文章目录 一、 回调函数和钩子函数的异同点1.1 回调函数和钩子函数的区别1.2 举例 二、回调函数和钩子函数的相同点 一、 回调函数和钩子函数的异同点 1.1 回调函数和钩子函数的区别 钩子函数和回调函数都是编程中常用的概念&#xff0c;它们在实现某些特定功能时都非常有用&…

java 读取word内容

接到一个任务&#xff0c;要读取doc文件的内容。解析里面的内容&#xff0c;进行一个处理和返回。 读取doc: 看了 很多文章&#xff0c;基本都是&#xff1a; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordExtractor; import java.i…

android 和 opencv 开发环境搭建

本文详细说明给android项目添加opencv库的详细步骤&#xff0c;并通过实现图片灰度化来查看配置是否成功。 下载OPENCV ANDROID SDK 到官网下载 打开 https://opencv.org/releases/ 选择android&#xff0c;下载完成后解压出下面的文件&#xff1a; 安装android sdk 和 ndk …

快手二面:节流和防抖知道吗?

面试官:节流与防抖&#xff0c;说说两者各自适用场景&#xff1f; 回答&#xff1a;面试官&#xff0c;在前端开发中&#xff0c;节流&#xff08;Throttle&#xff09;和防抖&#xff08;Debounce&#xff09;是两种常用的优化高频率执行JavaScript代码的技术。我将分别阐述它…

1.17号网络

网络属性 1> 对于套接字而言&#xff0c;在不同的层中&#xff0c;可以设置不同的属性&#xff0c;如端口号快速重用、超时时间、设置广播、加入多播组等等 2> 关于网络属性&#xff0c;有两个函数&#xff0c;分别是 setsockopt、getsockopt #include <sys/types.h…

数据库(基础理论+MySQL安装和部署)

目录 基础理论 1.1 什么是数据库&#xff1f; 1.2 DBMS数据库管理系统 1.3 数据库与文件系统的区别 1.4 数据库的发展和规划 1.5 常见的数据库 1.5.1 关系型数据库 1.5.2 非关系型数据库 1.6 DBMS支持的数据模型 层次模型 网状模型 关系模型 面向对象模型&#xf…

T2T VIT 学习笔记(附代码)

论文地址&#xff1a;https://arxiv.org/abs/2101.11986 代码地址&#xff1a;https://github.com/PaddlePaddle/PASSL/tree/main/configs/t2t_vit 1.是什么&#xff1f; T2T-ViT是一种基于Transformer的视觉模型&#xff0c;用于图像分类任务。它通过将图像分割成小的图块&…

在uni-app中使用sku插件,实现商品详情页规格展示和交互。

商品详情 - SKU 模块 学会使用插件市场&#xff0c;下载并使用 SKU 组件&#xff0c;实现商品详情页规格展示和交互。 存货单位&#xff08;SKU&#xff09; SKU 概念 存货单位&#xff08;Stock Keeping Unit&#xff09;&#xff0c;库存管理的最小可用单元&#xff0c;通…

【MyBatis-Plus】逻辑删除

对于一些比较重要的数据&#xff0c;我们通常采用逻辑删除。&#xff08;即用一个字段表示是否删除&#xff0c;实际上始终在数据库没有被删除&#xff09; 当逻辑删除字段为 true&#xff0c;业务处理的时候会自动把该数据当做一个“不存在”的数据处理。&#xff08;即不处理…

这篇Java基础快速入门学习教程,让我至少少走3个月弯路

一、作为刚接触Java的新手&#xff0c;先了解Java的基础。 Java 基本语法、Java 平台应用、Java的核心概念&#xff1a;JVM、JDK、JRE以及Java面向对象思想&#xff0c;同时要会学到如何在系统中搭建Java开发环境&#xff0c;以及如何利用第三方工具进行Java程序的开发。 还有…

计算机网络课程设计-Tracert 与 Ping 程序设计与实现

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 步骤 3.2 关键代码 3.2.1 发送ICMP数据报 3.2.2 解析收到的数据报 4 实验结果与分析 5 代码 5.1 ping代码 5.2 Tracert代码 前言 本实验为计算机网络课程设计内容&#xff0c;基本上所有代码都是根据指导书给的附录…

BigeMap在Unity3d中的应用,助力数字孪生

1. 首先需要用到3个软件&#xff0c;unity&#xff0c;gis office 和 bigemap离线服务器 Unity下载地址:点击前往下载页面(Unity需要 Unity 2021.3.2f1之后的版本) Gis office下载地址:点击前往下载页面 Bigemap离线服务器 下载地址: 点击前往下载页面 Unity用于数字孪生项…

Flutter中的图片查看器:使用photo_view库

在移动应用开发中&#xff0c;图片查看器是一个常见的需求。Flutter提供了许多库来简化这一过程&#xff0c;其中photo_view库是一个强大而灵活的选择。本文将介绍photo_view库的基本概念以及如何在Flutter应用中使用它来实现漂亮的图片查看体验。 1. 什么是photo_view库&…

ilqr 算法说明

1 Introduction 希望能用比较简单的方式将ilqr算法进行整理和总结。 2 HJB方程 假定我们现在需要完成一个从A点到B点的任务&#xff0c;执行这段任务的时候&#xff0c;每一步都需要消耗能量&#xff0c;可以用下面这个图表示。 我们在执行这个A点到B点的任务的时候&#xf…