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

    }

相关推荐
一知半解仙2 小时前
2026年彻底免费的辅助编程Agent大模型汇总
开发语言·人工智能·开源
Mr-Wanter2 小时前
wsl2 jdk管理工具之sdkman
java·开发语言·sdkman
2502_921286072 小时前
【企业网络管理】DHCP 与 SAMBA:从协议原理到企业级实战配置全解析
开发语言·php
矮小的方盒2 小时前
关于大型网站技术演进的思考(一)--存储的瓶颈(1)
开发语言
Maiko Star2 小时前
Python核心语法——函数
开发语言·python
大气的小蜜蜂3 小时前
基于Python+Django的健身房管理系统实现:核心亮点全流程解析
开发语言·python·django
天空'之城3 小时前
Linux 系统编程 04:进程基础
linux·开发语言·进程基础
2zcode3 小时前
免费开源项目文档:基于MATLAB图像处理的药片检测与计数系统设计与实现
开发语言·图像处理·matlab
charlie1145141913 小时前
Cinux: 加载第一个内核:从 bootloader 跳进 C++
linux·开发语言·c++·嵌入式