Qt 互斥锁 QMutex 的简单应用

在多线程解决问题中,经常会碰到多个线程操作同一片资源,有些时候用信号量的方式去处理,但有的时候需要用到互斥锁。

互斥锁:说白了就是,资源某个时间只能被一个线程使用。打个比方:家里的微波炉每次只能被一个人使用。

Qt中官网有个关于信号量的示例,http://doc.qt.io/qt-5/qtcore-threads-semaphores-example.html

我们将上面的示例改写,利用互斥锁来实现。

任务要求:

1、两条生产线,只能共用一个数据仓库,同时时间数据仓库只能被一条生产线来使用。
2、一条消费者先,只要数据仓库未空,就取出数据。

输入结果如下:

代码实现:

#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
#include <QDebug>
#include <QList>
#include<QMutex>const int DataSize = 15;
const int BufferSize = 20;QList<char> bufferlist;    //共享的数据列表QMutex mutexlock;    //互斥锁// 生产者线程类
class Producer_01 : public QThread
{public:void run();
};void Producer_01::run()
{qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));for (int i = 0; i < DataSize; ++i) {mutexlock.lock();char test = "ACGT"[(int)qrand() % 4];bufferlist.append(test);qDebug() << QString("producer_01: %1").arg(test);mutexlock.unlock();sleep(1);       }
}class Producer_02 : public QThread
{public:void run();
};void Producer_02::run()
{qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));for (int i = 0; i < DataSize; ++i) {mutexlock.lock();char test = "HIJK"[(int)i % 4];bufferlist.append(test);qDebug() << QString("producer_02: %1").arg(test);mutexlock.unlock();msleep(300);}
}// 消费者线程类
class Consumer : public QThread
{public:void run();
};void Consumer::run()
{while (1){if(bufferlist.isEmpty()==false)   //如果数据列表未空,就从头还是取数据{msleep(500);     //增加延时,表示消费的滞后时间qDebug() << QString("consumer: %1").arg(bufferlist[0]);bufferlist.removeAt(0);   //删除链表的头}}
}// 主函数
int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);Producer_01 producer_01;       //创建生产者的线程Producer_02 producer_02;Consumer consumer;             //创建消费者的线程producer_01.start();           //线程开启producer_02.start();consumer.start();               producer_01.wait();            producer_02.wait();consumer.wait();return app.exec();
}

总结:
1、互斥锁相对信号量更好理解和应用。
2、互斥锁同一时间只能被一条线程使用。本实例中最好在消费者线上也加上互斥锁,因为消费者线上也厚对共享列表的操作。

Qt 互斥锁 QMutex 的简单应用相关推荐

  1. 互斥锁 QMutex Class 的翻译

    互斥锁 QMutex Class 的翻译 简介 互斥锁的存在是为了保证线程间的访问资源的连续性.该资源可以是一个对象(object),数据结构(data structure),或者一段代码( a se ...

  2. Qt 互斥量 QMutex

    QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...

  3. 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...

    开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...

  4. Linux Qt使用POSIX多线程条件变量、互斥锁(量)

    今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...

  5. Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  6. 简单的JavaScript互斥锁

    去年有几个项目需要使用JavaScript互斥锁,所以写个几个类似的,这是其中一个: //Published by Indream Luo //Contact: indreamluo@qq.com / ...

  7. Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  8. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  9. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

最新文章

  1. 10任务栏全屏时老是弹出_Deepin 15.10 发布,深度操作系统
  2. C#共享内存实例 附源码
  3. 知乎热议:科研界是如何保护自己的成果免于剽窃的?
  4. AAAI | 深度生成模型—NEVAE
  5. p2148 [SDOI2009]ED
  6. 宜昌高新区三峡云计算机大楼,【智慧宜昌】CREATOR快捷CS分布式系统成功入驻三峡云计算中心...
  7. ibm3650m2 如何安装linux4,System x3650M2 (Type 7947) Windows Server 2008安装指南
  8. 哈希表中能有相同元素吗_最小删除以使用哈希表使所有元素相同
  9. 深入理解Java中的位操作
  10. 集合python_python集合访问的方法
  11. python可视化库matplotlib_Python数据可视化matplotlib库
  12. VC++ .net 2005运行库解析
  13. 处理table 超出部分滚动问题
  14. Python强化训练笔记(二)——元组元素的命名
  15. 联通4g满格但是网速慢_手机网速太慢怎么办 教你一招(4g信号满格网速很慢)...
  16. 微信公众号js复制到手机剪贴板
  17. 解决 zsh:command not found
  18. 如何选择指针中置空?NULL, nullptr, 0?
  19. 算法:使用单词表拼接字符串的方法数
  20. 百度云图片识别(ImageRecognition) 针对 各种图片识别的例子

热门文章

  1. 二十万字C/C++、嵌入式软开面试题全集宝典三
  2. [云炬创业管理笔记]第一章测试2
  3. [云炬创业基础笔记]第十章企业的利润计划测试2
  4. [云炬创业基础笔记]第二章创业者测试8
  5. FIR数字滤波器设计_窗函数法
  6. 有子对象的派生类的构造函数
  7. win10里安装和配置flex、bison
  8. 【不会吧不会吧,不会有人真的三分钟入门Python了吧?】Python编程基础
  9. BIO-NIO-AIO
  10. 排序二叉树BST(binary search/sort tree)