首页 > 其他分享 >笔记:Qt开发之多线程同步互斥机制

笔记:Qt开发之多线程同步互斥机制

时间:2023-10-23 11:56:46浏览次数:31  
标签:... QMutex Qt 作用域 互斥 线程 mutex 多线程

目标:了解Qt多线程开发中常用的同步互斥类,使用场景和特点   实现线程互斥和同步常用的类 互斥锁:QMute、QMutexLocker 条件变量:QWaitCondition 信号量:QSemaphore 读写锁:QReadLocker、QWriteLocker、QReadWriteLock   1,QMutex 特点:QMutex 是 Qt 框架提供的互斥锁类,用于保护共享资源的访问,实现线程间的互斥操作。 用途:在多线程环境下,通过互斥锁来控制对共享数据的访问,确保线程安全。

QMutex mutex;
// 上锁
mutex.lock();
// 访问共享资源
// ...
// 解锁
mutex.unlock();
  2,QMutexLocker 特点:QMutexLocker 是 QMutex 的辅助类,使用 RAII(Resource Acquisition Is Initialization)方式对互斥锁进行上锁和解锁操作。 用途:简化对互斥锁的上锁和解锁操作,避免忘记解锁导致的死锁等问题。
QMutex mutex;

{
    QMutexLocker locker(&mutex); // 在作用域内自动上锁
    // 访问共享资源
    // ...
} // 在作用域结束时自动解锁
  3,QReadWriteLocker、QReadLocker、QWriteLocker 特点: QReadWriteLock 是读写锁类,用于控制读和写的并发访问。 QReadLocker 用于读操作上锁,允许多个线程同时读取共享资源。 QWriteLocker 用于写操作上锁,只允许一个线程写入共享资源。 用途:在某些情况下,多个线程可以同时读取共享数据,但只有一个线程能够进行写操作。读写锁提供了更高效的并发访问方式。
QReadWriteLock rwLock;

// 在读操作中使用读锁
{
    QReadLocker locker(&rwLock); // 在作用域内自动上读锁
    // 读取共享资源
    // ...
} // 在作用域结束时自动解读锁

// 在写操作中使用写锁
{
    QWriteLocker locker(&rwLock); // 在作用域内自动上写锁
    // 修改共享资源
    // ...
} // 在作用域结束时自动解写锁
  4,QSemaphore 特点:QSemaphore 是 Qt 框架提供的计数信号量类,用于控制同时访问共享资源的线程数量。 用途:限制并发线程数量,用于解决一些资源有限的问题 信号量的典型用例是控制生产者/消费者之间共享的环形缓冲区。
QSemaphore semaphore(2); // 同时允许两个线程访问共享资源

// 在需要访问共享资源的线程中
semaphore.acquire(); // 尝试获取信号量,若已满则阻塞
// 访问共享资源
// ...
semaphore.release(); // 释放信号量

// 在另一个线程中进行类似操作
  5,QWaitCondition 特点:QWaitCondition 是 Qt 框架提供的条件变量类,用于线程之间的消息通信和同步。 用途:在某个条件满足时等待或唤醒线程,用于线程的同步和协调。
QMutex mutex;
QWaitCondition condition;

// 在等待线程中
mutex.lock();
// 检查条件是否满足,若不满足则等待
while (!conditionFullfilled()) {
    condition.wait(&mutex); // 等待条件满足并释放锁
}
// 条件满足后继续执行
// ...
mutex.unlock();

// 在改变条件的线程中
mutex.lock();
// 改变条件
changeCondition();
condition.wakeAll(); // 唤醒等待的线程
mutex.unlock();
                                                             

标签:...,QMutex,Qt,作用域,互斥,线程,mutex,多线程
From: https://www.cnblogs.com/bog-box/p/17782072.html

相关文章

  • 使用 MQTTnet 实现 MQTT 通信示例
    转自:https://cloud.tencent.com/developer/article/2103199一、什么是MQTT?MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。MQTT是基于二进制消息的发布/订阅编程模式的消息协议,如今已经成为OASIS......
  • 微信小程序 mqtt 连接中断原因
    上周开发微信小程序时新加了一个页面,复用了以前页面的逻辑,但是今天发现新加的页面出现了很奇怪的问题:进入新页面后,点一下查询再退出页面,mqtt连接正常;进入新页面后,直接返回退出页面,mqtt连接中断。WebSocketconnectionto"wss://www.xxxx.com/mqtt"failed:Closereceiveda......
  • 《安富莱嵌入式周报》第325期:开源可编程精密电阻仪,开源入耳式无线耳机,蓝牙Mesh固件更
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 更新一期视频,趁热打铁,下期CANopen专题视频将在下周发布BSP视频教程第27期:CANopen协议栈专题,实战方式系统了解NMT,PDO,SDO,时间戳,同步报文,紧急报文等(2023-10-17)https://www.armbb......
  • qt软件崩溃的分析方法-定位源文件和行号
    软件(debug版exe或者release版exe)在正常运行状态下(不是gdb调试运行),如果软件崩掉,那么会直接闪退,软件什么也做不了,此时无法保存软件中的状态信息,此外,也无法提供任何软件崩溃原因的信息。因此,软件崩掉,我们需要能给出信息才行,指导我们修改源码。解决方法如下(针对Windows):注:如果用vs开发qt......
  • QtCreator Key Bindings
    快捷键|功能-----|-----Esc|切换到代码编辑状态F1|查看帮助(选中某一类或函数,按下F1,出现帮助文档)F2|在光标选中对象的声明和定义之间切换(和Ctrl+鼠标左键一样的效果,选中某一类或函数,按下F2,迅速定位到该类或函数声明的地方或被调用的地方)F3|查找下一个F4|头文件和源文......
  • Jupyter QtConsole 配置,2023 年了你还在使用 QtConsole 吗?
    目录JupyterQtConsole配置,2023年了你还在使用QtConsole吗?JupyterQtConsole的安装设置字体启动时自动加载需要的库包JupyterQtConsole配置,2023年了你还在使用QtConsole吗?Jupyter想必大家已经很熟悉了,它是一个开源的交互式计算环境,支持多种编程语言。它提供了一个灵......
  • QT-多窗口程序编程
    exec()解析引用参考:qt中main函数中的exec()作用总结_qtexec-CSDN博客intmain(intargc,char*argv[]){ QApplicationa(argc,argv);MainWindoww;w.show();returna.exec(); //出现在此处}main函数的返回直接交由系统(更底层)进行处理,exec的作用则确定与......
  • QT&TCL1 调用TCL解释器
    TCL作为一种工具语言已经在很多地方得到广泛的应用,在土木方面著名的例子就是ANSYS了。当然作为UCB开发的OpenSees自然也是要用自家的TCL语言了,不过最新的OpenSees源代码中已经增加了对于Python语言的支持。虽然官方尚没有公开Python的使用方式,但是相信应该很快就可以看到使用Python......
  • QT中的线程池的介绍和使用
    (文章目录)前言本篇文章将为大家讲解一下QT中线程池的概念和使用的方法。一、线程池概念讲解线程池是一种常见的并发编程模型,用于管理和复用多个线程来执行任务。它的基本思想是在应用程序启动时创建一组线程,这些线程可以重复使用,以执行一系列的任务,而不需要为每个任务都创建......
  • 10_多线程
    ......