QRecursiveMutex Class

QRecursiveMutex 类提供线程间的访问序列化。更多

Header: #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 。但有时,一个公共函数会调用另一个公共函数,而这两个函数都需要锁定同一个 mutex。在这种情况下,你有两种选择:

  • 在调用私有实现函数之前,在公共函数中锁定一个普通的QMutex
  • 或者使用递归互斥体,这样当第二个公共函数希望锁定互斥体时,第一个公共函数已经锁定了互斥体也没有关系。

另请参阅 QMutex,QMutexLocker,QReadWriteLock,QSemaphoreQWaitCondition

成员函数文档

[constexpr noexcept] QRecursiveMutex::QRecursiveMutex()

构造一个新的递归互斥体。该互斥以解锁状态创建。

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

[noexcept] QRecursiveMutex::~QRecursiveMutex()

销毁互斥。

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

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

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

允许同一线程在同一互斥项上多次调用此函数。

注意: LockIsNoexcepttrue 时,此函数为 noexcept。

另请参阅 unlock() 。

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

尝试锁定互斥。如果锁定成功,则返回true ;否则返回false 。如果另一个线程锁定了互斥项,该函数将等待直到timeout 过期,互斥项才能可用。

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

允许同一线程在同一互斥项上多次调用此函数。

此函数在 Qt 6.6 中引入。

注意: LockIsNoexcepttrue 时,此函数为 noexcept。

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

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

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

注意:如果timeout 为负数,则等同于调用lock() ,也就是说,如果timeout 为负数,则此函数将永远等待互斥体被锁定。

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

允许同一线程在同一 mutex 上多次调用此函数。

注意: LockIsNoexcepttrue 时,此函数为 noexcept。

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

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

尝试锁定互斥。如果获得锁定,则返回true ;否则返回false

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

注意: LockIsNoexcepttrue 时,此函数为 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().

© 2025 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.