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实例变最的生存期内的代码段得到保护,自动进行互斥量的锁定和解锁。