QMutexLocker 类

template <typename Mutex> class QMutexLocker

QMutexLocker 类是简化锁定和解锁互斥的方便类。 更多...

头: #include <QMutexLocker>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意: 此类的所有函数 thread-safe .

公共函数

QMutexLocker (Mutex * mutex )
QMutexLocker (QMutexLocker<Mutex> && other )
~QMutexLocker ()
bool isLocked () const
Mutex * mutex () const
void relock ()
void swap (QMutexLocker<Mutex> & other )
void unlock ()
QMutexLocker<Mutex> & operator= (QMutexLocker<Mutex> && other )

详细描述

锁定和解锁 QMutex or QRecursiveMutex 在复杂函数、语句 (或异常处理) 中,代码容易出错且难以调试。QMutexLocker 可以用于这种状况以确保互斥状态始终定义良好。

应该在函数内创建 QMutexLocker,那里 QMutex 需要被锁定。互斥被锁定当 QMutexLocker 被创建时。可以解锁和重新锁定互斥采用 unlock() and 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());
        ...
    }
};
					

另请参阅 QReadLocker , QWriteLocker ,和 QMutex .

成员函数文档编制

[explicit] QMutexLocker:: QMutexLocker ( Mutex * mutex )

构造 QMutexLocker 和锁 mutex 。互斥会被解锁当 QMutexLocker 被销毁时。若 mutex is nullptr ,QMutexLocker 什么都不做。

另请参阅 QMutex::lock ().

[since 6.4] QMutexLocker:: QMutexLocker ( QMutexLocker < Mutex > && other )

Move-constructs a QMutexLocker from other . The mutex and the state of other is transferred to the newly constructed instance. After the move, other will no longer be managing any mutex.

该函数在 Qt 6.4 引入。

另请参阅 QMutex::lock ().

QMutexLocker:: ~QMutexLocker ()

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

另请参阅 QMutex::unlock ().

[since 6.4] bool QMutexLocker:: isLocked () const

返回 true,若此 QMutexLocker is currently locking its associated mutex, or false otherwise.

该函数在 Qt 6.4 引入。

Mutex *QMutexLocker:: mutex () const

返回互斥在那里 QMutexLocker 正在运转。

void QMutexLocker:: relock ()

重新锁定被解锁的互斥锁定器。

另请参阅 unlock ().

[since 6.4] void QMutexLocker:: swap ( QMutexLocker < Mutex > & other )

Swaps the mutex and the state of this QMutexLocker with other 。此操作非常快且从不失败。

该函数在 Qt 6.4 引入。

另请参阅 QMutex::lock ().

void QMutexLocker:: unlock ()

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

另请参阅 relock ().

[since 6.4] QMutexLocker < Mutex > &QMutexLocker:: operator= ( QMutexLocker < Mutex > && other )

移动赋值 other onto this QMutexLocker . If this QMutexLocker was holding a locked mutex before the assignment, the mutex will be unlocked. The mutex and the state of other is then transferred to this QMutexLocker . After the move, other will no longer be managing any mutex.

该函数在 Qt 6.4 引入。

另请参阅 QMutex::lock ().