多线程中的死锁

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

QMutex mutex1;
QMutex mutex2;

class ThreadA : public QThread
{
protected:
    void run()
    {
        while(true)
        {
            mutex1.lock();

            qDebug() << objectName() << "get mutex1";

            mutex2.lock();

            qDebug() << objectName() << "get mutex2";

            qDebug() << objectName() << "do work";

            mutex2.unlock();

            mutex1.unlock();

            sleep(1);
        }

    }
};

class ThreadB : public QThread
{
protected:
    void run()
    {
        while (true)
        {
            mutex2.lock();

            qDebug() << objectName() << "get mutex2";

            mutex1.lock();

            qDebug() << objectName() << "get mutex1";

            mutex1.unlock();

            mutex2.unlock();

            sleep(1);
        }

    }
};

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

    ThreadA task1;
    ThreadB task2;

    task1.setObjectName("task1");
    task2.setObjectName("task2");

    task1.start();
    task2.start();

    return a.exec();
}

从输出结果可知产生了死锁,task2获得mutex2后,想继续获得mutex1,但此时task1已获得mutex1,因此task2只能阻塞等待,同理,task1也只能阻塞等待

更改后

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

QMutex mutex1;
QMutex mutex2;

class ThreadA : public QThread
{
protected:
    void run()
    {
        while(true)
        {
            mutex1.lock();

            qDebug() << objectName() << "get mutex1";

            mutex2.lock();

            qDebug() << objectName() << "get mutex2";

            qDebug() << objectName() << "do work";

            mutex2.unlock();

            mutex1.unlock();

            sleep(1);
        }

    }
};

class ThreadB : public QThread
{
protected:
    void run()
    {
        while (true)
        {
            mutex1.lock();

            qDebug() << objectName() << "get mutex1";

            mutex2.lock();

            qDebug() << objectName() << "get mutex2";

            qDebug() << objectName() << "do work";

            mutex2.unlock();

            mutex1.unlock();

            sleep(1);
        }

    }
};

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

    ThreadA task1;
    ThreadB task2;

    task1.setObjectName("task1");
    task2.setObjectName("task2");

    task1.start();
    task2.start();

    return a.exec();
}

小结:为避免死锁的发生下,需要

1、对所有的临界资源都分配一个唯一的序列号

2、对应的线程锁也分配同样的序号

3、系统中的每个线程按照严格递增的次序申请资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值