QMutexLocker 类

template <typename Mutex> class QMutexLocker

QMutexLocker 类是一个方便类,它简化了互斥锁的锁定和解锁操作。 更多信息...

头文件 #include <QMutexLocker>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意: 本类中所有函数都是 线程安全

公共函数

QMutexLocker(Mutex *mutex)
(自 6.4 版起) QMutexLocker(QMutexLocker<Mutex> &&other)
~QMutexLocker()
(自 6.4 版起) boolisLocked() const
Mutex *mutex() const
voidrelock()
(自 6.4 版起) voidswap(QMutexLocker<Mutex> &other)
voidunlock()
(自 6.4 版起) QMutexLocker<Mutex> &operator=(QMutexLocker<Mutex> &&other)

详细描述

在复杂函数和语句或异常处理代码中锁定和解锁 QMutexQRecursiveMutex 可能会导致错误并且难以调试。QMutexLocker 可用于此类情况,以确保互斥锁的状态始终明确。

应在需要锁定 QMutex 的函数内创建 QMutexLocker。当 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<QMutex> locker;

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

    void waitForSignal()
    {
        ...
        while (!signalled)
            waitCondition.wait(locker.mutex());
        ...
    }
};

另请参阅 QReadLockerQWriteLockerQMutex.

成员函数文档

[显式 noexcept] QMutexLocker::QMutexLocker(Mutex *mutex)

构建一个 QMutexLocker 并锁定 mutex。当 QMutexLocker 被销毁时,将解锁互斥锁。如果 mutexnullptr,则 QMutexLocker 不执行任何操作。

另请参阅 QMutex::lock.

[noexcept,自 6.4] QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)

other 移除构建一个 QMutexLocker。互斥锁和 other 的状态将转移到新构建的实例。移动后,other 将不再管理任何互斥锁。

此功能自 Qt 6.4 以来已推出。

另请参阅 QMutex::lock.

QMutexLocker::~QMutexLocker()

销毁 QMutexLocker 并解锁在构造函数中锁定的互斥锁。

另请参阅 QMutex::unlock.

[noexcept,自 6.4] bool QMutexLocker::isLocked() const

如果此 QMutexLocker 正在锁定关联的互斥锁,则返回 true,否则返回 false。

此功能自 Qt 6.4 以来已推出。

Mutex *QMutexLocker::mutex() const

返回 QMutexLocker正在操作的互斥锁。

[noexcept] void QMutexLocker::relock()

重新锁定未锁定的互斥锁。

另请参阅 unlock.

[noexcept,自 6.4] void QMutexLocker::swap(QMutexLocker<Mutex> &other)

交换此 QMutexLockerother 的互斥锁和状态。此操作非常快速且永远不会失败。

此功能自 Qt 6.4 以来已推出。

另请参阅 QMutex::lock.

[noexcept] void QMutexLocker::unlock()

解锁此互斥锁。您可以使用 relock() 再次锁定它。销毁时不需要锁定。

另请参阅 relock.

[noexcept,自 6.4] QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)

other 移除到本 QMutexLocker。如果在本赋值之前此 QMutexLocker 持有一个已锁定的互斥锁,则将解锁该互斥锁。然后,将 other 的互斥锁和状态转移到此 QMutexLocker。移动后,other 将不再管理任何互斥锁。

此功能自 Qt 6.4 以来已推出。

另请参阅 QMutex::lock.

版权所有©2024 Qt公司有限公司。本文件中包含的文档贡献是各自所有者的知识产权。本文件提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款许可的。Qt及其相关标志是芬兰及/或其他国家和地区的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。