#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、系统中的每个线程按照严格递增的次序申请资源