一、描述
在复杂的函数和语句或异常处理代码中锁定和解锁 QMutex 容易出错且难以调试。 在这种情况下可以使用 QMutexLocker 来确保互斥锁的状态始终是明确定义的。
QMutexLocker 应该在需要锁定 QMutex 的函数中创建。 创建 QMutexLocker 时,QMutex 对象被锁定。可以使用 unlock() 和 relock() 解锁和重新锁定互斥锁。 如果锁定,则QMutex 对象会在 QMutexLocker 销毁时解锁。
例如,这个复杂的函数在进入函数时锁定 QMutex 并在所有退出点解锁互斥锁:
int complexFunction(int flag)
{
mutex.lock();
int retVal = 0;
switch (flag) {
case 0:
case 1:
retVal = moreComplexFunction(flag);
break;
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 大大简化了代码,并使其更具可读性:
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 对象被销毁时,QMutex将始终被解锁。
二、成员函数
1、QMutex * mutex()
返回 QMutexLocker 正在运行的互斥量对象。
2、void relock()
重新锁定未锁定的 QMutex。
3、void unlock()
解锁QMutex。