Qt 笔记:多线程间的互斥(上)

生产消费者问题

-有n个生产者同时制造产品,并把产品存入仓库中

-有m个消费者同时需要从仓库中取出产品

-规则:

·当仓库未满,任意生产者可以存入产品

·当仓库未空,任意消费者可以取出产品

#include <QCoreApplication>
#include <QThread>
#include <QDebug>

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("p");
    c.setObjectName("c");

    p.start();
    c.start();
    return a.exec();
}

临界资源(Critical Resource)

-每次只允许一个线程进行访问(读/写)的资源

线程间的互斥(竞争)

-多个线程在同一时刻都需要访问临界资源

QMutex类是一把线程锁,保证线程间的互斥

-利用线程锁能够保证临界资源的安全性

QMutex中关键成员函数

-void lock()

·当锁空闲时,获取锁并继续执行

·当锁被获取,阻塞并等待锁释放

-void unlock()

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

QMutex使用示例

QMutex mutex;//使用shi

mutex.lock();

// do something with critical resource

mutex.unlock();

ps:如果mutex在调用unlock()时处于空闲状态,那么程序的行为是未定义的!
#include <QCoreApplication>
#include <QThread>
#include <QMutex>
#include <QDebug>

static QMutex g_mutex;
static QString g_store;

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("p");
    c.setObjectName("c");

    p.start();
    c.start();
    return a.exec();
}

总结:

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

-线程锁(QMutex)用于保护临界资源

-线程只有获取锁之后才能访问临界资源

-锁被其他线程获取时,当前线程进入等待状态

-线程锁的获取和释放必须在同一线程中成对出现

猜你喜欢

转载自blog.csdn.net/qq_29962483/article/details/82971227