QMutexLocker用来简化互斥量的锁定和解锁操作。
在复杂函数或者异常处理代码中互斥量的锁定和解锁容易出错和难以调试。QMutexLocker就可以应用于这些情况,确保互斥量状态总是定义明确。
应该在程序中QMutex需要被锁定处创建QMutexLocker。当QMutexLocker被创建后,互斥量就锁定了。你可以使用unlock()和relock()来解锁和再次锁定互斥量。如果互斥量被锁定,当QMutexLocker销毁的时候,自动实现互斥量的解锁。
例如:在这个函数中,进入函数开始处锁定互斥量,在各个退出点解锁互斥量
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 对象被销毁的时候,就自动实现互斥量的解锁(因为QMutexLocker 是个局部变量,当函数返回时它就被销毁)。
这原则同样适用于抛出和捕获异常的代码。在异常处理函数中,如果互斥量已经被锁定,但是在异常被抛出之前还没有其他的地方解锁互斥量,那么异常将不被捕获。
QMutexLocker也提供了一个mutex()成员函数返回QMutexLocker操作的互斥量。对于需要访问互斥量是十分有用的,比如QWaitCondition::wait()。
例如:
class SignalWaiter
{
private:
QMutexLocker locker;
public:
SignalWaiter(QMutex *mutex): locker(mutex)
{
}
void waitForSignal()
{
...
while (!signalled)
waitCondition.wait(locker.mutex());
...
}
};
请参考 QReadLocker, QWriteLocker, 和 QMutex.
成员函数说明
QMutexLocker::QMutexLocker ( QMutex * mutex )
构造一个QMutexLocker对象并锁住互斥量。当QMutexLocker被销毁的时候,互斥量将被自动解锁。如果互斥量为0,QMutexLocker不起作用。
请参考 QMutex::lock().
QMutexLocker::~QMutexLocker ()
销毁QMutexLocker并且解锁在它构造函数中被锁定互斥量
请参考QMutex::unlock().
QMutex * QMutexLocker::mutex () const
返回在QMutexLocker构造函数中被锁定的互斥量
void QMutexLocker::relock ()
锁定一个解锁状态的互斥量
请参考 unlock().
void QMutexLocker::unlock ()
解锁互斥量。你可以使用relock()再次锁定它。当销毁的时候互斥量不应该被锁定。
请参考 relock()