Qt-系统线程安全(63)

news2024/11/24 22:35:18

目录

描述

使用

线程不安全

线程安全

释放锁问题

其他的锁

条件变量和信号量


描述

多线程程序太复杂了

在C/C++ 和 Linux中,我们为了保证线程安全,简单的方式就是加锁

 

为此 Qt  也封装了自己的一套锁管理

使用

线程不安全

我们先测验一下线程不安全的情况,先自定义一个类,等会要重写 QThread 类

thread.h 

thread.cpp

一个简单的累加 

运行发现,结果并不是我们所想象中的那样

线程安全

对++ 进行加锁,在CPU指令之中,++操作一共有三个指令,本身不是原子的,所以有线程不安全的问题,我们对涉及到修改的代码块进行加锁,保证线程安全

创建一共静态的锁对象,确保是使用同一把锁

运行正常,累加到了应有的数值 

 

释放锁问题

关于锁的释放,是有可能忘记释放的,忘记 unlock

在临界区之中,由于可能存在 判断,异常之类的操作,可能会导致锁没有释放

 

在C++释放内存中也有这样的问题存在,因此C++ 引入了智能指针,来解决内存释放和锁释放的问题

在出花括号区域的时候,lock_guard会自动调用析构,来释放 锁 

 

Qt 为了锁的释放也参考了这种做法,创建了 mutexLocker

使用如下,和C++之中的 std::lock_guard 使用方式一样

不建议和C++混着用锁相关函数

其他的锁

Qt中还有很多其他的锁,诸如读写锁,在特定的场景有着很好的发挥

QReadWriteLocker、QReadLocker、QWriteLocker

QReadWriteLock 是读写锁类,⽤于控制读和写的并发访问。
QReadLocker ⽤于读操作上锁,允许多个线程同时读取共享资源。
QWriteLocker ⽤于写操作上锁,只允许⼀个线程写⼊共享资源。

条件变量和信号量

条件变量

        在多线程编程中,假设除了等待操作系统正在执⾏的线程之外,某个线程还必须等待某些条件满⾜才能执⾏,这时就会出现问题。这种情况下,线程会很⾃然地使⽤锁的机制来阻塞其他线程,因为这只是线程的轮流使⽤,并且该线程等待某些特定条件,⼈们会认为需要等待条件的线程,在释放互斥锁或读写锁之后进⼊了睡眠状态,这样其他线程就可以继续运⾏。当条件满⾜时,等待条件的线程将被另⼀个线程唤醒。
在 Qt 中,专⻔提供了 QWaitCondition类 来解决像上述这样的问题。
        特点:QWaitCondition 是 Qt 框架提供的条件变量类,⽤于线程之间的消息通信和同步。
        ⽤途:在某个条件满⾜时等待或唤醒线程,⽤于线程的同步和协调

伪代码如下,使用过程也大致如下 

QMutex mutex;
QWaitCondition condition;
//在等待线程中
mutex.lock();
//检查条件是否满⾜,若不满⾜则等待
while (!conditionFullfilled())
{
condition.wait(&mutex); //等待条件满⾜并释放锁
}
//条件满⾜后继续执⾏
//...
mutex.unlock();
//在改变条件的线程中
mutex.lock();
//改变条件
changeCondition();
condition.wakeAll(); //唤醒等待的线程
mutex.unlock();

信号量

        有时在多线程编程中,需要确保多个线程可以相应的访问⼀个数量有限的相同资源。例如,运⾏程序的设备可能是⾮常有限的内存,因此我们更希望需要⼤量内存的线程将这⼀事实考虑在内,并根据可⽤的内存数量进⾏相关操作,多线程编程中类似问题通常⽤信号量来处理。信号量类似于增强的互斥锁,不仅能完成上锁和解锁操作,⽽且可以跟踪可⽤资源的数量。
        特点:QSemaphore 是 Qt 框架提供的计数信号量类,⽤于控制同时访问共享资源的线程数量。
        ⽤途:限制并发线程数量,⽤于解决⼀些资源有限的问题

伪代码,使用过程如下 

QSemaphore semaphore(2); //同时允许两个线程访问共享资源
//在需要访问共享资源的线程中
semaphore.acquire(); //尝试获取信号量,若已满则阻塞
//访问共享资源
//...
semaphore.release(); //释放信号量
//在另⼀个线程中进⾏类似操作

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

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

相关文章

七、程序流程控制

一、三种执行顺序 执行顺序说明顺序结构自上而下的执行代码分支结构根据条件,选择对应代码执行循环结构控制某段代码重复执行 二、分支结构 1、if 分支 根据条件(真或假)来决定执行某段代码if 分支有三种形式 //第一种形式 if(条件表达式…

Qt学习(一)——win10系统下Qt安装(Qt5.15.2+QtCreator5.0.3+MSVC2019)

win10平台下,Qt Creator 5.0.3 软件About Qt Creator界面如下: 其基于Qt 5.15.2 MSVC2019,64bit,故在用Qt4 设计师自定义控件所设计的控件能够被Qt Creator加载到,就要安装相应版本的Qt和MSVC。此安装便可支持win10系统下的自定义…

Java项目实战II基于Java+Spring Boot+MySQL的足球青训俱乐部管理后台系统的设计与开发(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 足球作为世…

【hot100-java】排序链表

链表题。 使用归并排序法。 一图解决。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; thi…

(刷题记录6)三数之和

三数之和 题目信息:题目思路(环境来自力扣OJ的C):暴力枚举:双指针:在三数之和上:转化成的两数之和:两数之和小优化: 复杂度:代码和解释:暴力枚举:双指针&…

【C语言】深入理解指针(三)(上)

本篇博客将讲解以下知识: 1、字符指针变量 2、数组指针变量 1、字符指针变量 在指针的类型中,有一种指针类型为字符指针:char* 一般使用: 注意:%s打印字符串的时候,需要提供字符串首元素的起始地址。 易错…

tensorflow + pygame 手写数字识别的小游戏

起因, 目的: 很久之前,一个客户的作业,我帮忙写的。 今天删项目,觉得比较简洁,发出来给大家看看。 效果图: 1. 训练模型的代码 import sys import tensorflow as tf# Use MNIST handwriting dataset mnist tf.kera…

C# 中循环的应用说明

一循环的概念说明 在C#编程中,循环结构是一种非常重要的控制流语句,它允许我们重复执行一段代码,直到满足某个特定条件为止。C#提供了几种不同类型的循环结构,包括for循环、while循环、do-while循环和foreach循环。 循环语句允许…

树莓派应用--AI项目实战篇来啦-7.OpenCV脸部和眼睛检测

1. 介绍 在深度学习时代,人脸识别一般是利用卷积神经网络进行监督式学习,也就是通过让算法(神经网络)自己去发现规律的方式,创造出有用的卷积核,然后利用其进行寻找图片和视频中的人脸,而在这之…

【Mac苹果电脑安装】DBeaverEE for Mac 数据库管理工具软件教程【保姆级教程】

Mac分享吧 文章目录 DBeaverEE 数据库管理工具 软件安装完成,打开效果图片Mac电脑 DBeaverEE 数据库管理工具 软件安装——v24.21️⃣:下载软件2️⃣:安装JDK,根据下图操作步骤提示完成安装3️⃣:安装DBeaverEE&#…

【ESP32】ESP-IDF开发 | LED PWM控制器+呼吸灯例程

1. 简介 LED PWM控制器,简称LEDC,主要用于控制LED的亮度和颜色,当然也可以当作普通的PWM进行使用。 LEDC有16路通道,8路高速通道和8路低速通道,16路通道都能够产生独立的数字波形来驱动LED设备。高速和低速通道分别有8…

C++:模拟stack、queue

目录 容器适配器 定义 特点 deque deque的优势与缺点 选择deque作为stack和queue的底层默认容器的原因 模拟实现stack 模拟实现queue 容器适配器 定义 在C标准模板库(STL)中,容器适配器(Container Adapters)是…

Harmony开发基础

背景介绍 鸿蒙系统的开发一来是为了打破国外垄断,实现操作系统的国产化,另一方面是针对目前市场上出现大量新的移动设备,手表,折叠屏等,移动端程序要适配不同设备,需要维护一套代码下的多个版本&#xff0…

U盘直接拔掉之后数据丢失怎么恢复 U盘数据丢失了怎么恢复

U盘作为一种存储设备,可以帮助人们存储很多资料文件,无论是办公文件,亦或是生活中的照片,所以在存储数据文件时,人们是比较依赖U盘。不过,U盘也存在很多的不确定性,比如数据容易丢失、或者损坏。…

NirCmd-sendkeysendkeypress

引入script [Script File] This command allows you to execute a sequence of commands stored inside the file specified in [Script File] parameter. Example: script "c:\temp\msg.ncl" Example for a script:infobox "Hello !" "This is the …

微知-如何查看服务器CPU当前运行主频?(cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq)

关键命令 cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq背景 首先lscpu可以查看到有多个cpu,里面也会显示cpu的频率,但是这里显示仅仅是规格,不是实际值。为了查看实际值,需要到/sys文件系统中查看,也…

大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

ARIMA 模型初体验 —— 预测股票数据

第 1 步,从 twelvedata 上获取苹果 11 号 15:30 到 16:00 的 OHLC、成交量 数据。 第 2 步,编写 Python 代码(实际上可以用 R 语言,R 语言从语言的级别对分析预测提供了支持,而 Python 需要第三方库)。 …

Yolov8 搭配 Frequency-aware Feature Fusion for Dense Image Prediction

个人觉得论文赞的地方 https://github.com/Linwei-Chen/FreqFusion https://www.arxiv.org/abs/2408.12879 因为我有个项目需要训练边界模糊的情况,但又需要目标能在模糊里凸显出来,就是看到这张图以后觉得很赞,边界变得清晰有特征是我想要的,所以尝试用了 使后感 哈哈…

【CSS3】css开篇基础(2)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…