Qt——多线程间的互斥

1.示例:消费者和生产者问题

消费者消费一个产品,生产者生产一个产品

复制代码
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <QString>

static QString g_store;

class Producer : public QThread
{
protected:
    void run()
    {
        int count = 0;
        while(true)
        {
            g_store.append(QString::number((count++) % 10));

            qDebug() << objectName() << ":" + g_store;

            msleep(1);
        }
    }
};

class Customer : public QThread
{
protected:
    void run()
    {
        while(true)
        {
            if( g_store != "")
            {
                g_store.remove(0, 1); //去除第一个元素
                qDebug() << objectName() << ":" + g_store;
            }
            msleep(1);
        }

    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Producer p;
    Customer c;

    p.setObjectName("Producer");
    c.setObjectName("Customer");

    p.start();
    c.start();

    return QCoreApplication::exec();
}

但是当消费者和生产者同时访问g_store时,就会产生竞争,程序会崩溃

2.临界资源:每次只允许一个线程进行访问(读/写)的资源

线程间的互斥(竞争):多个线程在同一时刻都需要访问临界资源

QMutex类是一把线程锁,保证线程间的互斥,利用线程锁能够保证临界资源的安全性

3.QMutex中的关键成员函数

  • void lock() 当锁空闲时,获取锁并继续执行;当锁被获取,阻塞并等待锁释放

  • void unlock() 释放锁(同一把锁的获取和释放锁必须在同一线程中成对出现)

    #include
    #include
    #include
    #include
    #include

    static QString g_store;
    static QMutex g_mutex;

    class Producer : public QThread
    {
    protected:
    void run()
    {
    int count = 0;
    while(true)
    {
    g_mutex.lock();
    g_store.append(QString::number((count++) % 10));

    复制代码
              qDebug() << objectName() << ":" + g_store;
              
              g_mutex.unlock();
              msleep(1);
          }
      }

    };

    class Customer : public QThread
    {
    protected:
    void run()
    {
    while(true)
    {
    g_mutex.lock();
    if( g_store != "")
    {
    g_store.remove(0, 1); //去除第一个元素
    qDebug() << objectName() << ":" + g_store;
    }
    g_mutex.unlock();
    msleep(1);
    }

    复制代码
      }

    };

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    复制代码
      Producer p;
      Customer c;
    
      p.setObjectName("Producer");
      c.setObjectName("Customer");
    
      p.start();
      c.start();
    
      return QCoreApplication::exec();

    }

相关推荐
速易达网络5 小时前
Three.js 动画入门教学:从场景搭建到流畅动效
开发语言·javascript·ecmascript
福大大架构师每日一题5 小时前
excelize v2.11.1发布:Go 1.26.0起步,16项安全修复与嵌入对象能力全面升级
开发语言·安全·golang
Sarvartha5 小时前
集合概述 & Collection 接口
开发语言
lhbweilai5 小时前
QT项目(串口助手)
开发语言·qt
eggwyw6 小时前
C++相交链表和反转链表详解
开发语言·c++
Wang's Blog6 小时前
Java 项目实战:交友项目 - 保存访客记录
java·开发语言·交友
Raas1006 小时前
AI网关如何接入?MAI Gateway部署实操教程
java·开发语言·人工智能·gateway·ai网关·mai gateway·企业级产品
小小龙学IT6 小时前
Go 语言 pprof 性能剖析与调优深度解析:把“卡在哪“变成一张可执行的数据图
开发语言·后端·golang
starzy19906 小时前
Scala Set深度解析:为什么大数据开发离不开它?
大数据·开发语言·scala
熊猫钓鱼>_>7 小时前
三方库 NDK 原生模块跨平台适配与调试【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙心迹