当前位置: 首页 > news >正文

Qt中的锁和条件变量和信号量

Qt中的锁和条件变量和信号量

C++11中引入智能指针用来解决锁忘记释放的问题

代码如下:

void Thread::run()
{for(int i=0;i<50000;i++){QMutexLocker locker(&mutex);//mutex.lock();num++;//mutex.unlock();}
}

大括号结束的时候,生命周期踩结束,会在析构函数里面进行解锁

多个线程之间的调度是无序的,所以需要条件变量来干预顺序

1QMutex mutex;
2 QWaitCondition condition;
3
4 //在等待线程中
5 mutex.lock();
6
7 //检查条件是否满⾜,若不满⾜则等待
8
9 while (!conditionFullfilled()) 
10 {
11 condition.wait(&mutex); //等待条件满⾜并释放锁
12 }
13
14 //条件满⾜后继续执⾏
15 //...
16
17 mutex.unlock();
18
19 //在改变条件的线程中
20 mutex.lock();
21
22 //改变条件
23 changeCondition();
24 condition.wakeAll(); //唤醒等待的线程
25
26 mutex.unlock();

信号量

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

特点:QSemaphore 是 Qt 框架提供的计数信号量类,⽤于控制同时访问共享资源的线程数量。

⽤途:限制并发线程数量,⽤于解决⼀些资源有限的问题。

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

相关文章:

  • Science:机器学习模型进行遗传变异外显率预测
  • 线段树相关算法题(5)
  • 【大语言模型 30】指令微调数据工程:高质量数据集构建
  • audioLDM模型代码阅读(二)——HiFi-GAN模型代码分析
  • 【光照】[光照模型]发展里程碑时间线
  • C++ 高并发内存池项目——无锁化设计、TLS 线程隔离与内存碎片优化
  • fork详解(附经典计算题)
  • 【系列07】端侧AI:构建与部署高效的本地化AI模型 第6章:知识蒸馏(Knowledge Distillation
  • mit6.824 2024spring Lab3A Raft
  • 简说DDPM
  • C语言---零碎语法知识补充(队列、函数指针、左移右移、任务标识符)
  • 机器人控制器开发(底层模块)——rk3588s 的 CAN 配置
  • 码农特供版《消费者权益保护法》逆向工程指北——附源码级注释与异常处理方案
  • 人工智能训练师复习题目实操题2.2.1 - 2.2.5
  • 手表--带屏幕音响-时间制切换12/24小时
  • PS学习笔记
  • 【15】VisionMaster入门到精通——--通信--TCP通信、UDP通信、串口通信、PLC通信、ModBus通信
  • 计算机算术7-浮点基础知识
  • 面经分享--小米Java一面
  • 青年教师发展(中科院软件所-田丰)
  • Dify 从入门到精通(第 65/100 篇):Dify 的自动化测试(进阶篇)
  • MCP与A2A的应用
  • LightGBM(Light Gradient Boosting Machine,轻量级梯度提升机)梳理总结
  • 【AI工具】在 VSCode中安装使用Excalidraw
  • 【69页PPT】智慧工厂数字化工厂蓝图规划建设方案(附下载方式)
  • 基于 Kubernetes 的 Ollama DeepSeek-R1 模型部署
  • 内存管理(智能指针,内存对齐,野指针,悬空指针)
  • Java中Integer转String
  • 为什么企业需要项目管理
  • 安卓编程 之 线性布局