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 多线程(生产者消费者)相关推荐

  1. python多线程实现生产者消费者_用Python实现多线程“生产者-消费者”模型的简单例子...

    用 Python 实现多线程"生产者 - 消费者"模型的简单例子 生产者消费者问题是一个著名的线程同步问题, 该问题描述如下: 有一个生产者在生产产品, 这些产品将提供给若干个消费 ...

  2. linux多线程 消费者,linux c 多线程 生产者-消费者二

    linux c 多线程 生产者--消费者2 实在不好意思,第一个版本有些问题,是局部变量和堆里面变量的区别.今天做了一下修改.代码如下. #ifndef _LIST_H_ #define _LIST_ ...

  3. Java多线程-生产者消费者问题(多个消费者多个生产者)

    Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...

  4. Java多线程生产者消费者调度实现

    生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...

  5. 多线程生产者消费者模型

    1. 基础知识: 1. 什么是生产者-消费者模式: 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的 ...

  6. Linux多线程——生产者消费者模型

    目录 一.生产者消费者模型 1.1 什么是生成者消费者模型 1.2 生产者消费者模型的优点 1.3 基于阻塞队列实现生产者消费者模型 1.4 POSIX信号量 1.4.1 信号量概念 1.4.2 P操 ...

  7. Java多线程——生产者消费者问题

    创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作. 生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案 ...

  8. 多线程-生产者-消费者模型

    一.前言 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描 ...

  9. Linux基于单链表环形队列的多线程生产者消费者模型

    生产者–消费者模型简述 对于生产者–消费者模型,相信我们都不陌生,因为生活中,我们无时无刻不在扮演生产者或消费者.但是对于Linux中的生产者–消费者模型,大家又了解了一个什么程度? 其实,说白了就是 ...

  10. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例

    /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...

最新文章

  1. oracle_dataGuard_11G
  2. 爬虫综合大作业(震惊!爬取了590位微信好友后竟然发现了)
  3. S5PV210开发 -- 开发板配置
  4. OpenGL 绘制彩色三角形的实例
  5. mysql 升级 openssl_升级openssl
  6. IDEA svn 菜单不见了,解决方法
  7. 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
  8. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
  9. ASP.NET缓存中Cache过期的三种策略
  10. JS基础_js编写位置
  11. rvm,ruby的安装
  12. xshell连接kali系统
  13. pdf关键字高亮 java_Java查找并高亮PDF文本过程解析
  14. 微博、QQ、微信第三方登录 Java 实现实录
  15. 2016年安徽省程序设计竞赛 水题C,D,E 题解
  16. Grunt的安装与使用 (以Windows 64位为例)
  17. sql根据身份证号计算现在的年龄
  18. 下载王者荣耀高清壁纸
  19. Android 自定义 HorizontalScrollView 横向滑动效果
  20. MotionEvent 事件解读

热门文章

  1. WCF RIA Service中 POCO实体含有复杂类型怎么处理?
  2. Sql Server 清除日志的存储过程 Procedure of cleaning sql server's log
  3. C++ STL Pair
  4. UA MATH563 概率论的数学基础 鞅论初步6 鞅的性质 鞅差序列
  5. UA MATH523A 实分析3 积分理论例题 Fubini定理计算简单二重积分的一个例题
  6. 内存管理单元MMU学习
  7. Three.js 入门示例
  8. Win32 API CreateCompatibleDC 函数的相关应用
  9. 创建和准备Oracle样例数据库
  10. DOS命令温习(图解)