Qt多线程同步-生产者消费者模式

Qt多线程同步,使用互斥量。

  • 实现

    • 分别创建生产者类、消费者类,继承QThread,重写run()。
    • 主函数创建生产者类实例、消费者类实例;使用start()启动线程,里面会调用run();使用wait()等待线程结束。
  • 生产者类.h文件,如下。

cpp 复制代码
#ifndef PRODUCERTHREAD_H
#define PRODUCERTHREAD_H

#include <QThread>

#include <QDebug>
#include <QQueue>
#include <QMutex>

class ProducerThread : public QThread
{
public:
    ProducerThread();

protected:
    void run();  //重写run()
};

#endif // PRODUCERTHREAD_H
  • 生产者类.cpp文件,如下。
cpp 复制代码
#include "producerthread.h"

QMutex mutex;              //互斥量,用于保护共享资源
QQueue<int> buffer;        //缓冲区, 用于存放数据
const int BufferSize = 10; //缓冲区大小
const int DataSize = 20;   //每个线程数据量

ProducerThread::ProducerThread() {}

void ProducerThread::run()
{
    int i=0;
    while(true)
    {
        mutex.lock();

        if(buffer.size()<BufferSize) //缓冲区不满时
        {
            buffer.enqueue(i);
            qDebug()<< "Producer ID:" <<  QThread::currentThreadId() << " Produced: " << i ;
        }

        mutex.unlock();
        if(++i==DataSize) return; //生产DataSize个数据
        msleep(100); //模拟生产过程
    }

}
  • 消费者类.h文件,如下。
cpp 复制代码
#ifndef CONSUMERTHREAD_H
#define CONSUMERTHREAD_H

#include <QThread>

class ConsumerThread : public QThread
{
public:
    ConsumerThread();

protected:
    void run();
};

#endif // CONSUMERTHREAD_H
  • 消费者类.cpp文件,如下。
cpp 复制代码
#include "consumerthread.h"

#include "producerthread.h"
extern QMutex mutex;              //引用互斥量
extern QQueue<int> buffer;        //引用缓冲区
extern const int DataSize = 20;   //引用每个线程数据量

ConsumerThread::ConsumerThread(){}

void ConsumerThread::run()
{
    int i=0;
    while(true)
    {
        mutex.lock();

        if(!buffer.isEmpty()) //缓冲区不空时
            qDebug()<< "Consumer ID:" <<  QThread::currentThreadId() << " Consumed: " << buffer.dequeue();

        mutex.unlock();
        if(++i==DataSize) return; //消费DataSize个数据
        msleep(200);   //模拟消费过程
    }
}
  • main.cpp,如下。
cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

#include"consumerthread.h"
#include"producerthread.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();

    ProducerThread producer1;
    ProducerThread producer2;
    ConsumerThread consumer1;
    ConsumerThread consumer2;

    producer1.start();
    producer2.start();
    consumer1.start();
    consumer2.start();

    producer1.wait();
    producer2.wait();
    consumer1.wait();
    consumer2.wait();

    return a.exec();
}
相关推荐
weixin_440784117 小时前
【HandlerThread实现原理】
android·java·开发语言
天空'之城7 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
XR1234567888 小时前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟8 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君9 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1239 小时前
SpringDAO的用法
java·开发语言·数据库
格林威11 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
初级代码游戏13 小时前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
峥嵘life14 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
wgego15 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记