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();

    }

相关推荐
IT_Octopus3 小时前
JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录
开发语言·python·json
geovindu3 小时前
python:HandWriting Recognition using paddlepaddle
开发语言·后端·python·paddlepaddle
mengzhi啊3 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
wuyk5554 小时前
Python 零基础入门第九章:用户输入与 While 循环
开发语言·python
兮动人4 小时前
Python变量与常量
开发语言·python·机器学习·python变量与常量
风筝在晴天搁浅4 小时前
解题代码清爽版
java·开发语言
Java后端的Ai之路4 小时前
21、Python - 命令模式
开发语言·人工智能·python·命令模式·外观模式
astronautyi4 小时前
Go 运行时内存分配与 GC 位图深度剖析
开发语言·后端·golang
techdashen4 小时前
Go 中如何处理错误
开发语言·后端·golang
孙克旭_4 小时前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm