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();
}
相关推荐
geovindu几秒前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7772 分钟前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
布朗克1684 分钟前
Go 入门到精通-29-测试与基准
开发语言·后端·golang·测试与基准
格林威1 小时前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
小大宇1 小时前
Python 集成 Conda
开发语言·python·conda
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
小大宇2 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
Legendary_0083 小时前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
柒星栈3 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之3 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript