本页内容

QRecursiveMutex Class

QRecursiveMutex 类用于在线程之间实现访问序列化。更多内容...

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

注意:该类中的所有函数均是线程安全的。

公共函数

QRecursiveMutex()
~QRecursiveMutex()
void lock()
(since 6.6) bool tryLock(QDeadlineTimer timeout = {})
bool tryLock(int timeout)
bool try_lock()
bool try_lock_for(std::chrono::duration<Rep, Period> duration)
bool try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
void unlock()

详细说明

QRecursiveMutex 类是一个互斥锁,与QMutex 类似,且与之 API 兼容。它与QMutex 的不同之处在于,它允许同一线程无限次调用lock()。在这种情况下,QMutex 会导致死锁。

QRecursiveMutex 的构造和操作开销要大得多,因此请尽可能使用普通的QMutex 。不过,有时一个公共函数会调用另一个公共函数,而它们都需要锁定同一个互斥量。在这种情况下,你有两种选择:

  • 将需要互斥锁保护的代码提取到私有函数中,这些私有函数在被调用时会假设互斥锁已被持有,并在公共函数中调用私有实现之前,先锁定一个普通的QMutex 。
  • 或者使用递归互斥锁,这样当第二个公共函数需要锁定互斥锁时,即使第一个公共函数已经锁定了该互斥锁,也不会造成问题。

另请参阅 QMutex 、QMutexLocker 、QReadWriteLock 、QSemaphore 以及QWaitCondition 。

成员函数文档

[constexpr noexcept default] QRecursiveMutex::QRecursiveMutex()

创建一个新的递归互斥锁。该互斥锁在创建时处于解锁状态。

另请参阅 lock() 和unlock()。

[noexcept] QRecursiveMutex::~QRecursiveMutex()

销毁互斥锁。

警告:销毁 被锁定的互斥锁可能会导致未定义的行为。

[noexcept(...)] void QRecursiveMutex::lock()

锁定互斥锁。如果另一个线程已锁定该互斥锁,则此调用将阻塞,直到该线程解锁为止。

允许同一线程对同一互斥量多次调用此函数。

注意: 当LockIsNoexcept 的值为true 时,该 函数为noexcept。

另请参阅 unlock()。

[noexcept(...), since 6.6] bool QRecursiveMutex::tryLock(QDeadlineTimer timeout = {})

尝试锁定互斥量。如果成功获得锁,该函数返回true ;否则返回false 。如果另一个线程已锁定该互斥量,该函数将等待直至timeout 超时,以便互斥量变得可用。

如果成功获取了锁,则必须先使用unlock() 解锁互斥锁,其他线程才能成功锁定该互斥锁。

允许同一线程对同一互斥量多次调用此函数。

该函数在 Qt 6.6 中引入。

注意: 当LockIsNoexcept 为true 时,此 函数为 noexcept。

另请参见 lock() 和unlock()。

[noexcept(...)] bool QRecursiveMutex::tryLock(int timeout)

尝试锁定互斥量。如果成功获得锁,该函数返回true ;否则返回false 。如果另一个线程已锁定该互斥量,该函数将最多等待timeout 毫秒,直到互斥量可用。

注意:将负数作为timeout 参数传递等同于调用lock(),即如果timeout 为负数,则该函数将无限期等待,直到可以锁定互斥锁为止。

如果获得了锁,则必须先通过unlock() 解锁互斥锁,另一个线程才能成功锁定它。

允许从同一个线程对同一个互斥锁多次调用此函数。

注意: 当LockIsNoexcept 为true 时,此 函数为 noexcept。

另请参阅 lock() 和unlock()。

[noexcept(...)] bool QRecursiveMutex::try_lock()

尝试锁定互斥量。如果成功获得锁,该函数返回true ;否则返回false 。

提供此函数是为了与标准库概念Lockable 保持兼容。它等同于tryLock()。

注: 当 `LockIsNoexcept ` 为 `true` 时,该 函数为 `noexcept`。

template <typename Rep, typename Period> bool QRecursiveMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)

尝试锁定互斥量。如果成功获得锁,该函数返回true ;否则返回false 。如果另一个线程已锁定该互斥量,该函数将至少等待duration ,直到互斥量可用。

注意:将负数作为duration 参数传递,等同于调用try_lock()。此行为与tryLock()不同。

如果成功获取了锁,则必须先通过unlock() 解锁互斥锁,其他线程才能成功锁定它。

允许同一线程对同一互斥锁多次调用此函数。

另请参见 lock() 和unlock()。

template <typename Clock, typename Duration> bool QRecursiveMutex::try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)

尝试锁定互斥量。如果成功获得锁,该函数返回true ;否则返回false 。如果另一个线程已锁定该互斥量,该函数将至少等待至timePoint ,直到互斥量可用为止。

注意:传入一个已经过期的timePoint ,其效果等同于调用try_lock()。此行为与tryLock()不同。

如果已获得锁,则必须先使用unlock() 解锁互斥锁,另一个线程才能成功锁定它。

允许同一线程对同一互斥锁多次调用此函数。

另请参见 lock() 和unlock()。

[noexcept] void QRecursiveMutex::unlock()

解锁互斥锁。若尝试在与锁定该互斥锁不同的线程中解锁,将引发错误。解锁未被锁定的互斥锁将导致未定义行为。

另请参阅 lock()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.