QT 互斥锁
一、概述
1、在多线程编程中,为了防止多个线程同时访问共享资源而导致的不确定性和错误,经常会使用互斥锁(Mutex)进行保护。
2、QMutex是Qt提供的一个互斥锁类,用于确保在同一时间只有一个线程访问共享资源。
3、QMutexLocker就是在使用QMutex时的便利工具类。它在构造函数中自动锁定给定的QMutex对象,并在析构函数中自动解锁。这样可以有效地保证锁的正确使用,避免由于异常或忘记解锁时而导致地资源泄露或死锁。
二、使用方式
方式一:
mutex.lock();
//这里处理共享资源
mutex.unlock();
方式二:
QMutexLocker locker(&mutex);
//这里处理共享资源
三、示例
1、未加锁:
//共享资源
int sharedValue = 0;
//互斥锁
QMutex mutex;
class MThread : public QThread
{
public:
void run() override
{
for(int i = 0; i < 5; i++)
{
// 访问共享资源
sharedValue++;
qDebug() << "Thread ID: " << QThread::currentThreadId()
<< "Shared Value: " << sharedValue;
msleep(1000);
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MThread thread1;
MThread thread2;
thread1.start();
thread2.start();
thread1.wait();
thread2.wait();
return a.exec();
}
运行结果:
2、加锁后 :
class MThread : public QThread
{
public:
void run() override
{
for(int i = 0; i < 5; i++)
{
QMutexLocker locker(&mutex);
// 访问共享资源
sharedValue++;
qDebug() << "Thread ID: " << QThread::currentThreadId()
<< "Shared Value: " << sharedValue;
// 线程休眠1秒
msleep(1000);
}
}
};
运行结果:
结果分析:明显看出在未加锁情况下对临界资源的访问出现混乱的结果