QMutexLocker简化了锁定和解锁操作。
头文件:
#include <QMutexLocker>
QMutexLocker类是一个方便类,简化了锁定和解锁互斥。
在复杂函数和语句或异常处理代码中锁定和解锁QMutex容易出错且难以调试。QMutexLocker可用于此类情况,以确保始终定义好互斥的状态。
QMutexLocker应在需要锁定QMutex 的函数中创建。创建QMutexLocker 时,互斥器将被锁定。您可以使用 和 解锁和重新锁定静音。如果锁定,当QMutexLocker 被销毁时,将解锁互不可用。unlock()relock()
例如,此复杂函数在进入函数时锁定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的构造函数接受一个互斥量作为参数并将其锁定,QMulcxLockcr的析构函数则将此互斥量解锁,所以在QMutexLocker实例变最的生存期内的代码段得到保护,自动进行互斥量的锁定和解锁。