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();
}
相关推荐
我滴老baby2 分钟前
工具调用全景解析从Function Calling到MCP协议的完整实践
开发语言·人工智能·python·架构·fastapi
小李子呢02112 分钟前
前端八股JS---Map / Set / WeakMap / WeakSet
开发语言·前端·javascript
feifeigo1233 分钟前
自适应大邻域搜索(ALNS)算法的MATLAB 实现
开发语言·算法·matlab
繁星蓝雨12 分钟前
Qt多界面创建的优化问题(main函数或主界面中创建?)—————附带详细方法
c++·qt·架构·多界面管理
沐知全栈开发14 分钟前
API 类别 - 实用工具
开发语言
Cx330❀19 分钟前
Qt 入门指南:从零搭建开发环境到第一个图形界面程序
xml·大数据·开发语言·网络·c++·人工智能·qt
SilentSamsara21 分钟前
装饰器基础:从闭包到装饰器的自然演变
开发语言·前端·vscode·python·青少年编程·pycharm
今天长肉了吗1 小时前
风控指标平台实战:大数据量下如何设计分批处理
开发语言·数据库·python
ch.ju1 小时前
Java programming(The third edition) Chapter Two——Null return value
java·开发语言
折哥的程序人生 · 物流技术专研1 小时前
第3篇:为何要配置环境变量?
java·开发语言·后端·面试