【QT之QMutexLocker】

【QT之QMutexLocker】

描述

QMutexLocker类是一个方便类,它简化了互斥锁的锁定和解锁。
在复杂的函数和语句或异常处理代码中锁定和解锁QMutex容易出错,而且很难调试。QMutexLocker可以在这种情况下使用,以确保互斥对象的状态始终定义良好。
QMutexLocker应该在需要锁定QMutex的函数中创建。创建QMutexLocker时,互斥锁被锁定。您可以使用unlock()和relock()来解锁和重新锁定互斥对象。如果被锁定,那么当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对象被破坏时(当函数返回时,因为locker是一个自动变量),互斥锁将始终解锁。
同样的原理也适用于抛出和捕获异常的代码。在异常通过堆栈传递给调用函数之前,锁定互斥锁的函数中没有捕获到的异常无法解锁互斥锁。
QMutexLocker还提供了一个mutex()成员函数,该函数返回QMutexLocker操作的互斥量。这对于需要访问互斥体的代码非常有用,例如QWaitCondition::wait()。例如:

class SignalWaiter
{
private:
    QMutexLocker locker;

public:
    SignalWaiter(QMutex *mutex)
        : locker(mutex)
    {
    }

    void waitForSignal()
    {
        ...
        while (!signalled)
            waitCondition.wait(locker.mutex());
            //bool QWaitCondition::wait(QMutex *lockedMutex, 
            //QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
        ...
    }
};

成员函数

QMutexLocker::QMutexLocker(QRecursiveMutex *mutex)
//构造一个QMutexLocker并锁定互斥对象。当QMutexLocker被销毁时,互斥对象将被解锁(调用unlock())。
//如果互斥对象是nullptr,那么QMutexLocker将不执行任何操作。
QMutexLocker::QMutexLocker(QMutex *mutex)
//构造一个QMutexLocker并锁定互斥对象。当QMutexLocker被销毁时,互斥锁将被解锁。
//如果互斥对象是nullptr,那么QMutexLocker将不执行任何操作。

QMutex *QMutexLocker::mutex() const
//返回QMutexLocker正在操作的互斥对象。

void QMutexLocker::relock()
//重新锁定未锁定的互斥锁。

void QMutexLocker::unlock()
//解锁此互斥锁。您可以使用relock()再次锁定它。销毁时不需要锁定。
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值