今天在看别人的代码时,看到了QMutexLocker这个类,一看居然没有解锁的代码,于是就产生了好奇,特此记录一下。
注意:这个类中的所有函数都是线程安全的。
#include <QMutexLocker>
创建:创建的时候就是为下面代码加锁的时候
QMutexLocker ( QMutex * mutex );
为什么要引入QMutexLocker,大家都知道QMutex是为了线程安全而产生的,同理QMutexLocker也是,只是它相对于QMutex要简化了许多,也比较不容易出错。
咋们来看下下面的代码:
QMutex mutex;
int complexFunction(int flag)
{
mutex.lock();
int retVal = 0;
switch (flag) {
case 0:
case 1:
mutex.unlock();
return moreComplexFunction(flag);
case 2:
{
int status = anotherFunction();
if (status < 0) {
mutex.unlock();
return -2;
}
retVal = status + flag;
}
break;
default:
if (flag > 10) {
mutex.unlock();
return -1;
}
break;
}
mutex.unlock();
return retVal;
}
在每个函数出口的时候都要解锁一遍,这不仅增加了代码的复杂性也增加了发生错误的可能性。
咋们再来看看使用QMutexLocker的时候,有多简单:
QMutex mutex;
int complexFunction(int flag)
{
QMutexLocker locker(&mutex);
int retVal = 0;
switch (flag) {
case 0:
case 1:
return moreComplexFunction(flag);
case 2:
{
int status = anotherFunction();
if (status < 0)
return -2;
retVal = status + flag;
}
break;
default:
if (flag > 10)
return -1;
break;
}
return retVal;
}
当QMutexLocker对象被销毁时,互斥锁将始终处于解锁状态。也就是说当这个函数执行完,QMutexLocker就会因为自身的机制解锁。