QTcreator 多线程(生产者消费者)
qt应用的多线程实例简单实现,语法超级简单,用两种方法实现同步和互斥。一种是Semaphore信号量,另一种是mutex锁和condition条件变量。下面开始。
第一种,QSemaphore信号量方式:
通过Qt Creator创建一个控制台项目,项目创建完以后只有一个main.cpp文件和一个.pro配置文件,在main.cpp添加如下内容
#include <QSemaphore>
#include <QThread>
#include <QApplication>const qint32 DataSize=10;
const qint32 BufferSize=4;//仓库
int buffer[BufferSize];
//控制生产者线程信号量:写入的数据缓冲区
QSemaphore freeSpace(BufferSize);
//控制消费者线程信号量:读取的数据缓冲区
QSemaphore usedSpace(0);//生产者线程类
class threadProducer:public QThread
{
public:void run(){for(int i=0;i<DataSize;++i){//仓库有空闲位置,生产一个数据//空闲位置少一个,控制生产的信号量加一freeSpace.acquire();buffer[i%4]=i+1;qDebug("producer::%d",buffer[i%4]);//可消费的数据多一个,控制消费者信号量+1usedSpace.release();sleep(1);}}
};
class threadConsumer:public QThread
{
public:void run(){for(int i=0;i<DataSize;++i){usedSpace.acquire();qDebug("consumer:%d",buffer[i%4]);freeSpace.release();sleep(2);}}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);threadConsumer consumer;threadProducer producer;producer.start();consumer.start();producer.wait();consumer.wait();return a.exec();
}
第二种,QWaitCondition和QMutex方式
#include <QCoreApplication>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>const qint32 DataSize=10;
const qint32 BufferSize=4;int buffer[BufferSize];
QWaitCondition bufferIsNotFull;
QWaitCondition bufferIsNotEmpty;
QMutex mutex;
int usedSpace=0;//生产者线程类
class threadProducer:public QThread
{
public:void run(){for (int i=0; i<DataSize; ++i){mutex.lock();//如果仓库满了,不生产,等待销费while (usedSpace==BufferSize){bufferIsNotFull.wait(&mutex);}buffer[i%4]=i+1;qDebug("producer:%d",buffer[i%4]);++usedSpace;bufferIsNotEmpty.wakeAll();mutex.unlock();}}
};class threadConsumer:public QThread
{
public:void run(){for(int i=0;i<DataSize;++i){mutex.lock();while (usedSpace==0){bufferIsNotEmpty.wait(&mutex);}qDebug("consumer:%d",buffer[i%4]);--usedSpace;bufferIsNotFull.wakeAll();mutex.unlock();}}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);threadConsumer consumer;threadProducer producer;producer.start();consumer.start();producer.wait();consumer.wait();return a.exec();
}
QTcreator 多线程(生产者消费者)相关推荐
- python多线程实现生产者消费者_用Python实现多线程“生产者-消费者”模型的简单例子...
用 Python 实现多线程"生产者 - 消费者"模型的简单例子 生产者消费者问题是一个著名的线程同步问题, 该问题描述如下: 有一个生产者在生产产品, 这些产品将提供给若干个消费 ...
- linux多线程 消费者,linux c 多线程 生产者-消费者二
linux c 多线程 生产者--消费者2 实在不好意思,第一个版本有些问题,是局部变量和堆里面变量的区别.今天做了一下修改.代码如下. #ifndef _LIST_H_ #define _LIST_ ...
- Java多线程-生产者消费者问题(多个消费者多个生产者)
Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...
- Java多线程生产者消费者调度实现
生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...
- 多线程生产者消费者模型
1. 基础知识: 1. 什么是生产者-消费者模式: 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的 ...
- Linux多线程——生产者消费者模型
目录 一.生产者消费者模型 1.1 什么是生成者消费者模型 1.2 生产者消费者模型的优点 1.3 基于阻塞队列实现生产者消费者模型 1.4 POSIX信号量 1.4.1 信号量概念 1.4.2 P操 ...
- Java多线程——生产者消费者问题
创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作. 生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案 ...
- 多线程-生产者-消费者模型
一.前言 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描 ...
- Linux基于单链表环形队列的多线程生产者消费者模型
生产者–消费者模型简述 对于生产者–消费者模型,相信我们都不陌生,因为生活中,我们无时无刻不在扮演生产者或消费者.但是对于Linux中的生产者–消费者模型,大家又了解了一个什么程度? 其实,说白了就是 ...
- java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例
/**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...
最新文章
- oracle_dataGuard_11G
- 爬虫综合大作业(震惊!爬取了590位微信好友后竟然发现了)
- S5PV210开发 -- 开发板配置
- OpenGL 绘制彩色三角形的实例
- mysql 升级 openssl_升级openssl
- IDEA svn 菜单不见了,解决方法
- 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
- python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
- ASP.NET缓存中Cache过期的三种策略
- JS基础_js编写位置
- rvm,ruby的安装
- xshell连接kali系统
- pdf关键字高亮 java_Java查找并高亮PDF文本过程解析
- 微博、QQ、微信第三方登录 Java 实现实录
- 2016年安徽省程序设计竞赛 水题C,D,E 题解
- Grunt的安装与使用 (以Windows 64位为例)
- sql根据身份证号计算现在的年龄
- 下载王者荣耀高清壁纸
- Android 自定义 HorizontalScrollView 横向滑动效果
- MotionEvent 事件解读