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();
}
相关推荐
筑基.5 分钟前
basic_ios及其衍生库(附 GCC libstdc++源代码)
开发语言·c++
雨颜纸伞(hzs)20 分钟前
C语言介绍
c语言·开发语言·软件工程
J总裁的小芒果22 分钟前
THREE.js 入门(六) 纹理、uv坐标
开发语言·javascript·uv
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang11 小时前
leetcode hot100 LRU缓存
java·开发语言
时雨h1 小时前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
云计算DevOps-韩老师1 小时前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
暮色尽染2 小时前
Python 正则表达式
开发语言·python
IT猿手2 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
小爬虫程序猿2 小时前
利用Java爬虫获取速卖通(AliExpress)商品详情的详细指南
java·开发语言·爬虫