Qt线程间的同步(QMutex、QReadWriteLock、QSemaphone、QWaitCondition、信号槽)

news2025/1/16 17:26:52

同步方法:
1、互斥锁QMutex、函数互斥锁QMutexLocker。
2、读写锁QReadWriteLock、读锁QReadLockerr、写锁QWriteLocker。
3、信号量QSemaphore(QSystemSemaphore支持进程间的同步)。
4、条件变量QWaitConditon。
5、信号槽(第五个参数控制)。

QMutex
介绍:是可以上锁和解锁的。当多个线程同时使用同一个互斥锁时,首先抢到互斥锁的线程将互斥锁上锁,在互斥锁未解锁时,其他线程是不能使用该互斥锁的。
使用场景:多线程。
常用函数:上锁lock()、开锁unlock()、尝试上锁try_lock();
注意:一般配合QMutexLocker使用更好,QMutexLocker只作用当前所在函数,出了函数则自动解锁。
如:

QMutex mutex;
void Widget::testMutex()
{
    //上锁	
	QMutexLocker(&mutex);
	//...
	//函数执行完毕后,自动解锁。
}

详细介绍
QReadWriteLock
介绍:读写锁的特性:读共享,写独占。默认优先级是写优先,即写锁的优先级>读锁,哪怕是读先排队的也没用。
使用场景:一般应用与具有大量读操作的场景。
常用函数:lockForRead() 请求读锁;lockForWrite() 请求写锁;tryLockForRead() 尝试请求读锁,非阻塞函数,可以设置超时时间;tryLockForWrite() ; 尝试请求写锁,非阻塞函数,可以设置超时时间;unlock() ; 解锁(解读锁和解写锁,均使用该函数)
注意:常关联的类包含:QReadLocker和QWriteLocker,它们可以拆开使用。
详细介绍

信号量QSemaphore
介绍:QSemaphore作为QT中的信号量,相当于多把互斥锁,QMutex只锁一次,而QSemaphore能锁多次,且控制多个条件。
使用场景:多线程且需要分级上锁和解锁。
常用函数:acquire(int n = 1)获取资源,默认获取第一个资源,相当于获取资源后加锁,如果没有资源会阻塞到当前位置;available()获取当前可用资源数量;release(int n = 1)释放n个资源r,相当于开锁;tryAcquire(int n = 1)尝试获取第n个资源,相当于开启n把锁,开锁成功后返回true,失败返回false,不阻塞。
注意:QSystemSemaphore可以作用雨进程间的同步,使用方法如下:
semaphore1

#include <QApplication>
#include <QSystemSemaphore>
#include <QDebug>
#include <QThread>
#include <QDateTime>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSystemSemaphore sem("sem", 1, QSystemSemaphore::Create);
    while(true)
    {
        sem.acquire();
        qDebug() << "1"<<QDateTime::currentDateTime();
        QThread::sleep(1);
        sem.release();
    }

    return a.exec();
}

semaphore2

#include <QCoreApplication>
#include <QSystemSemaphore>
#include <QDebug>
#include <QThread>
#include <QDateTime>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSystemSemaphore sem("sem", 1, QSystemSemaphore::Create);
    while(true)
    {
        sem.acquire();
        qDebug() << "2"<<QDateTime::currentDateTime();
        QThread::sleep(1);
        sem.release();
    }

    return a.exec();
}

在这里插入图片描述
QSemaphore详细实例

条件变量QWaitConditon
介绍:告知不同的线程让谁先启动,等待条件变量满足后在启动,条件不满足则进入睡眠等待状态,不会往下执行,卡在wait()语句这一行。
使用场景:多线程且需要手动的唤醒和睡眠进程。
常用函数:wait()将使得调用它的线程进入睡眠状态;wakeOne()随机唤醒一个等待的线程;wakeAll()唤醒所有的线程。
注意:一般需要配合QMutex互斥锁来使用。
详细实例

信号槽(第五个参数控制)
介绍:这是QT中线程间常用的同步方式之一。只需要设置Connect的第五个参数为BlockingQueuedConnection。
使用场景:适用于两个线程间的同步。
使用方法
函数原型之一:

static QMetaObject::Connection connect(const QObject *sender, const char *signal,
                        const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);
                        

第五个参数Qt::ConnectionType:
enum ConnectionType {
AutoConnection,
DirectConnection,
QueuedConnection,
BlockingQueuedConnection,
UniqueConnection = 0x80
};
Qt::AutoConnection:默认的连接类型。Qt自动决定使用直接连接(DirectConnection)还是队列连接(QueuedConnection),基于发信号的对象和接收槽的对象是否在同一个线程。
Qt::DirectConnection:槽函数立即被调用当这个信号发出的时候。槽函数在发送信号的线程中执行。
Qt::QueuedConnection:当信号发出时,它会被放入事件队列中。当控制权返回到接收对象所在线程的事件循环时,槽函数才会被调用。这适用于跨线程通信,确保槽函数在其所属线程的上下文中被调用。(异步)
Qt::BlockingQueuedConnection:类似于QueuedConnection,但是发送信号的线程会阻塞,将等待接收槽函数执行完成后才会解除阻塞。接收者和发送者绝对不能在一个线程,否则程序会死锁。(同步)
Qt::UniqueConnection:确保同一信号和槽之间不会建立多个连接。
详细介绍

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

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

相关文章

Jmeter07:函数

1 Jmeter组件&#xff1a;函数 1.1 是什么&#xff1f; 是程序中的封装单元&#xff08;最小的&#xff09;&#xff0c;封装一些功能实现 1.2 为什么&#xff1f; 优点1&#xff1a;易读 易维护 优点2&#xff1a;实现功能复用 1.3 怎么用&#xff1f; 流程&#xff1a; 1&…

[ADS信号完整性分析]深入理解IBIS AMI模型设计:从基础到实践

在高速数字设计领域&#xff0c;信号完整性&#xff08;SI&#xff09;分析对于确保系统性能至关重要。IBIS AMI&#xff08;Algorithmic Model Interface&#xff09;模型作为一种强大的工具&#xff0c;能够帮助设计师在系统层面上评估和优化SERDES&#xff08;串行器/解串器…

【STM32】基于I2C协议的OLED显示(利用U82G库)

【STM32】基于I2C协议的OLED显示(利用U82G库) 文章目录 【STM32】基于I2C协议的OLED显示(利用U82G库)一、实验背景二、U8g2介绍&#xff08;一&#xff09;获取&#xff08;二&#xff09;简介 三、实践&#xff08;一&#xff09;CubexMX配置&#xff08;二&#xff09;U8g2配…

【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分

目录 一、&#x1f525;今日目标 二、&#x1f388;SpringBoot部分类的添加 1.调用MybatisGenerator 2.添加DocSaveParam 3.添加DocQueryVo 三、&#x1f686;后端新增接口 3.1添加DocController 3.1.1 /all/{ebokId} 3.1.2 /doc/save 3.1.3 /doc/delete/{idStr} …

Pixi.js学习 (五)动画效果与变量逻辑控制

目录 前言 一、动画效果 1.1 帧频 1.2 帧频函数 二、变量逻辑控制 2.1 定义变量的语法 2.2 使用变量控制逻辑 2.3 使用变量控制追加效果 三、实战 例题一&#xff1a;完成天天酷跑 例题一代码&#xff1a; 总结 前言 为了提高作者的代码编辑水品&#xff0c;作者在使用博客的时…

day35|1005.K次取反后最大化的数组和 134. 加油站135. 分发糖果

文章目录 python语法记录 sort格式 1005.K次取反后最大化的数组和思路方法一方法二 按照绝对值排序 教程&#x1f388;✨ 背住 按照绝对值进行降序排序的语法是&#xff1a; 134. 加油站思路方法一 教程解法方法二 暴力求解 135. 分发糖果思路方法一 总结 python语法记录 sort …

【AI大模型】Transformers大模型库(七):单机多卡推理之device_map

目录​​​​​​​ 一、引言 二、单机多卡推理之device_map 2.1 概述 2.2 自动配置&#xff0c;如device_map"auto" 2.3 手动配置&#xff0c;如device_map"cuda:1" 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#x…

MapTR代码复现-nucenes数据集

前言 本节将对环视车道线MapTR算法进行复现&#xff0c;使用nuscenes-mini数据集&#xff01; 一、环境配置 1、基础环境&#xff1a; ubuntu20.04&#xff0c;pytorch1.10.0&#xff0c;python3.8&#xff0c;cuda11.3 2、源码下载 下载地址&#xff1a; git clone http…

基础IO(下)

基础IO 1. 磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑抽象结构 2. 理解文件系统2.1 前言2.2 文件系统2.3 文件的新建和删除2.4 文件的查找2.5 理解软硬链接 3. 动态库和静态库3.1 生成静态库3.2 生成动态库3.3 动态库加载 实际上&#xff0c;大部分文件都不是被打开的&#xff08;当…

pikachu靶场通关全流程

目录 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存储型xss&#…

一道初中一年级几何题解析

来看一个初中一年级的几何题目&#xff1a; 直接看第三问。 拿到题后直接解的话就是在 BC 上截取 BP 等于 CE&#xff0c;就直接得出 PBD 和 ECD 全等&#xff0c;加上角 EDF 等于 45 度&#xff0c;就能得到角 EDF 等于角 PDF&#xff0c;于是 PDF 与 EDF 全等&#xff0c;…

自定义组件——ABManager(AB包管理器)

需求描述 在Unity3D引擎中&#xff0c;AB包作为常用的游戏资源存储格式之一。而对于资源管理我们就不得不谈到集中管理的优势了&#xff0c;通过统一的接口加载和卸载AB包及其中的资源将进一步提升我们的编程效率。本文将围绕这个需求进行尝试。 功能描述 1. AB包的加载包括同…

代码随想录算法训练营第五十五 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> d…

遇到的状态308问题

前端用的vue.config.js做的代理,请求后端的地址https://n6118lr7-10010.usw3.devtunnels.ms 在请求的时候会308 是因为本地是http而请求地址是https 前端代理允许https接口代理即可

电脑缺失d3dx9_43.dll是怎么回事,总结5种实测有效的解决方法

电脑在使用过程中偶尔会遇到一些问题&#xff0c;其中之一就是缺失d3dx9_43.dll文件。那么&#xff0c;电脑缺失d3dx9_43.dll​是怎么回事呢&#xff1f;本文将从多个方面进行详细描述&#xff0c;帮助大家更好地了解这个问题。 一&#xff0c;d3dx9_43.dll文件的概述 d3dx9_4…

Python中的钩子函数(hooks)介绍使用

什么是hook&#xff1f; 钩子函数&#xff0c;顾名思义&#xff0c;就是把我们自己实现的自定义函数在某一时刻挂接到目标挂载点上去执行。 1. hook函数&#xff0c;就是我们自己实现的函数&#xff0c;函数类型与挂载点匹配&#xff08;返回值&#xff0c;参数列表&#xff0…

virtual box安装invalid installation directory

问题原因 看官方文档Chapter 2. Installation Details 第2.1.2所示&#xff0c;安装目录需要满足两个条件&#xff1a; 一是&#xff1a;需要安装目录的所有父目录都要满足以下访问控制条件 Users S-1-5-32-545:(OI)(CI)(RX) Users S-1-5-32-545…

添加L1/L2损失函数,以及AttributeError: ‘NoneType‘ object has no attribute ‘data‘

添加L1/L2损失函数&#xff0c;以及解决报错 1.添加L1 loss2.添加L2 loss3.代码报错&#xff1a;AttributeError: NoneType object has no attribute data 1.添加L1 loss # 方式1&#xff1a;添加到损失函数中 def l1_regularization(model, l1_alpha):l1_loss []for module …

健康节能台灯的设计电子实践

1.1 功能描述 根据主要功能要求&#xff0c;该设计利用 51 单片机实现了电子时钟、温度的显示以 及整点报时等功能。具体可分为一下几种&#xff1a; 1) 显示当前的日期及时间&#xff0c;24 时制的时、分、秒&#xff1b; 2) 可调节时间&#xff1b; 3) 整点报时并响铃。 4) 能…

SpringCloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)

一、微服务演变 1、单体架构&#xff08;Monolithic Architecture&#xff09; 是一种传统的软件架构模式&#xff0c;应用程序的所有功能和组件都集中在一个单一的应用中。 在单体架构中&#xff0c;应用程序通常由一个大型的、单一的代码库组成&#xff0c;其中包含了所有…