Qt 互斥锁 QMutex 的简单应用
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 的简单应用相关推荐
- 互斥锁 QMutex Class 的翻译
互斥锁 QMutex Class 的翻译 简介 互斥锁的存在是为了保证线程间的访问资源的连续性.该资源可以是一个对象(object),数据结构(data structure),或者一段代码( a se ...
- Qt 互斥量 QMutex
QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...
- 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...
开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...
- Linux Qt使用POSIX多线程条件变量、互斥锁(量)
今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...
- Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...
- 简单的JavaScript互斥锁
去年有几个项目需要使用JavaScript互斥锁,所以写个几个类似的,这是其中一个: //Published by Indream Luo //Contact: indreamluo@qq.com / ...
- Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...
- Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步
主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
最新文章
- 10任务栏全屏时老是弹出_Deepin 15.10 发布,深度操作系统
- C#共享内存实例 附源码
- 知乎热议:科研界是如何保护自己的成果免于剽窃的?
- AAAI | 深度生成模型—NEVAE
- p2148 [SDOI2009]ED
- 宜昌高新区三峡云计算机大楼,【智慧宜昌】CREATOR快捷CS分布式系统成功入驻三峡云计算中心...
- ibm3650m2 如何安装linux4,System x3650M2 (Type 7947) Windows Server 2008安装指南
- 哈希表中能有相同元素吗_最小删除以使用哈希表使所有元素相同
- 深入理解Java中的位操作
- 集合python_python集合访问的方法
- python可视化库matplotlib_Python数据可视化matplotlib库
- VC++ .net 2005运行库解析
- 处理table 超出部分滚动问题
- Python强化训练笔记(二)——元组元素的命名
- 联通4g满格但是网速慢_手机网速太慢怎么办 教你一招(4g信号满格网速很慢)...
- 微信公众号js复制到手机剪贴板
- 解决 zsh:command not found
- 如何选择指针中置空?NULL, nullptr, 0?
- 算法:使用单词表拼接字符串的方法数
- 百度云图片识别(ImageRecognition) 针对 各种图片识别的例子