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

Qt LockSemaphore

QMutex

QMutex 是 Qt 框架提供的互斥锁类,用于保护共享资源的访问,实现线程间的互斥操作。在多线程环境下,通过互斥锁来控制对共享数据的访问,确保线程安全。

QMutex mutex; mutex.lock(); // 加锁 // ... 共享资源 mutex.unlock(); // 解锁

QMutexLocker

QMutexLocker 是 QMutex 的辅助类,简化对互斥锁的上锁和解锁操作,避免忘记解锁导致的死锁等问题。

QMutex mutex; { QMutexLocker locker(mutex); // 在作用域内自动上锁,出了作用域自动解锁 }

QReadWriteLocker、QReadLocker、QWriteLocker

  • QReadWriteLock :读写锁类,用于控制读和写的并发访问。

  • QReadLocker :用于读操作上锁,允许多个线程同时读取共享资源。

  • QWriteLocker :用于写操作上锁,只允许一个线程写入共享资源。

多个线程可以同时读取共享数据,但只有一个线程能够进行写操作。读写锁提供了更高效的并发访问方式。

QReadWriteLock rwLock; // 在读操作中使用读锁 { QReadLocker locker(&rwLock); // 在作用域内自动上读锁,出了作用域自动解锁 // 读取共享资源 // ... } // 在写操作中使用写锁 { QWriteLocker locker(&rwLock); // 在作用域内自动上写锁,出了作用域自动解锁 // 修改共享资源 // ... }

信号量

QSemaphore

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

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

QWaitCondition

QWaitCondition是Qt中的一个类,用于在多线程编程中实现线程同步。它允许一个线程通知其他线程某个条件已经满足,从而协调线程之间的工作。QWaitCondition通常与QMutex一起使用,以确保线程安全。

在生产者-消费者模型中,生产者线程负责生成数据,而消费者线程负责处理数据。QWaitCondition可以用来协调生产者和消费者之间的工作,确保数据的正确读写。

  • wait:用于让线程在条件未满足时阻塞等待,直到被其他线程通过wakeOne()wakeAll()唤醒,或者等待超时;在使用时必须传入一个上锁的 QMutex 对象
  • wakeAll:在满足特定条件时唤醒所有等待线程
  • wakeOne:在满足特定条件时随机唤醒一个正在等待的线程
onst int data_size = 50; const int buf_size = 10; char buffer[buf_size]; QWaitCondition buffer_is_not_full; QWaitCondition buffer_is_not_empty; QMutex mutex; int used_space=0; class Producer : public QThread { protected: void run() { for (int i = 0; i < data_size; ++i) { mutex.lock(); while (used_space == buf_size) { // 如果buffer已经满了,这时不能再生产了 buffer_is_not_full.wait(&mutex); // 等待buffer_is_not_full调用wakeAll/wakeOne,否则继续阻塞 // 等待mutex 释放 } std::cerr<<"a"; ++used_space; buffer_is_not_empty.wakeAll(); // 唤醒消费线程 mutex.unlock(); } } }; class Consumer : public QThread { protected: void run() { for (int i = 0; i < data_size; ++i) { mutex.lock(); while (used_space == 0) { // buffer已经空了,这时不能再消费类了 buffer_is_not_empty.wait(&mutex); // 等待buffer_is_not_empty调用wakeAll/wakeOne,否则继续阻塞 } std::cerr<<"b"; --used_space; buffer_is_not_full.wakeAll(); // 唤醒生产线程 mutex.unlock(); } std::cerr<<std::endl; } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return app.exec(); }
http://www.jsqmd.com/news/619967/

相关文章:

  • 【Dify踩坑实录】Windows容器化部署:PostgreSQL数据目录权限异常排查与修复
  • 附录N-2 技术评审通知
  • 如何解决地理数据可视化难题:geojson2svg的坐标映射与样式控制方案
  • mysql如何优化小表的查询索引_mysql全表扫描与索引代价对比
  • 《吃透QClaw原生运行逻辑:解决指令无响应、权限阻塞、上下文断层的独家实操避坑指南》
  • LinkSwift:八大网盘直链下载助手 - 免费高速下载的终极解决方案
  • 狗狗牵绳没带嘴套遛狗规范检测数据集VOC+YOLO格式1728张3类别
  • Docker企业级常用命令汇总记录(持续更新)
  • CSS——样式
  • Qt步进电机上位机控制程序源代码,支持串口、Tcp网口、Udp网络三种端口类型,详细注释和讲解
  • K8s RBAC实战:一个实验搞定权限控制
  • 从模拟到数字:深入解析PCM(脉冲编码调制)的核心三步骤
  • 混合路由:语义与精准查询协同,餐厅场景实战教程
  • FIB-SEM样品制备避坑指南:从二维截面到TEM薄片的5个常见错误及解决方案
  • 工单管理系统能解决哪些问题,主流平台功能对比
  • 工业SSD如何评估供应商的长期供货保障能力?供货稳定的SSD厂商推荐 - 讯息观点
  • B站m4s转换工具:3分钟解锁缓存视频的终极解决方案
  • macOS极简体验:星图平台OpenClaw镜像+Qwen3.5-9B云端调试
  • 将盾CDN:红蓝对抗中的攻击痕迹排查与溯源分析
  • 测试驱动开发(TDD)的职业优势:案例剖析
  • FreeRtos一直进入SVC_Handler中断,不运行
  • 深度解析macOS微信防撤回工具:技术架构与实战应用指南
  • php反序列化(复习)(第三章)
  • 体验美好日常,美人荟携手门店,共建社区品质生活圈
  • 如何快速安全弹出USB设备:终极USB磁盘弹出工具使用指南
  • PPTist:浏览器中打造专业演示文稿的终极解决方案
  • PyTorch训练时GPU未启用的常见原因与解决方案
  • 物联网安全实践--基于ESP8266的WiFi干扰器DIY全流程解析
  • 别再让高码流RTSP视频卡住你的OpenCV项目了!手把手教你用Python队列+跳帧搞定稳定取流
  • 给参考文献添加DOI链接的问题