QRecursiveMutex 类

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

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

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

公共函数

QRecursiveMutex()
~QRecursiveMutex()
voidlock()
booltryLock(int timeout)
(自 6.6) booltryLock(QDeadlineTimer timeout = {})
booltry_lock()
booltry_lock_for(std::chrono::duration<Rep, Period> duration)
booltry_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
voidunlock()

详细描述

QRecursiveMutex 类是一个互斥锁,就像 QMutex,与它具有兼容的 API。它不同于 QMutex,因为它接受来自同一线程的任意次数的 lock() 调用。在这种情况下,QMutex 会导致死锁。

构造和操作 QRecursiveMutex 成本更高,因此在可能的情况下始终使用普通的 QMutex。然而,有时一个公开的函数会调用另一个公开的函数,并且它们都需要锁定同一个互斥锁。在这种情况下,你有两种选择:

  • 将需要互斥锁保护的代码分解为私有函数,假设在它们被调用时互斥锁已被锁定,并在调用私有实现之前的公开函数中锁定一个普通的 QMutex
  • 或者使用递归互斥锁,因此第一次公开函数已经锁定了互斥锁并不重要,当第二个函数想要锁定时。

另请参阅:QMutexQMutexLockerQReadWriteLockQSemaphoreQWaitCondition

成员函数文档

[constexpr noexcept] QRecursiveMutex::QRecursiveMutex()

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

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

[noexcept] QRecursiveMutex::~QRecursiveMutex()

销毁互斥锁。

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

[noexcept] void QRecursiveMutex::lock()

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

从同一线程多次调用此函数锁定同一互斥锁是允许的。

另请参阅解锁

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

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

注意:传递负数作为 timeout 等同于调用 lock(),即如果 timeout 为负,此函数将无限期地等待互斥锁可用。

如果成功获得锁,必须在其他线程成功锁定它之前使用 unlock() 将互斥锁解锁。

从同一线程多次调用此函数锁定同一互斥锁是允许的。

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

[noexcept,自 6.6 版起] bool QRecursiveMutex::tryLock(QDeadlineTimer timeout = {})

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

如果成功获得锁,必须在其他线程成功锁定它之前使用 unlock() 将互斥锁解锁。

从同一线程多次调用此函数锁定同一互斥锁是允许的。

此功能自 Qt 6.6 版开始引入。

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

[noexcept] bool QRecursiveMutex::try_lock()

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

此函数提供与标准库概念 Lockable 相兼容。它等同于 tryLock

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()。

© 2024 Qt 公司有限公司。本文档中的文档贡献者分别享有版权。本文档受GNU 自由文档许可证版本 1.3的许可,由自由软件基金会发布。Qt及其相应标志是芬兰和/或其他国家的Qt公司商标。所有其他商标均为其相应所有者财产。