QRecursiveMutex 类
QRecursiveMutex 类提供线程间的访问序列化。 更多...
头文件 | #include <QRecursiveMutex> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 所有成员列表,包括继承成员
- QRecursiveMutex 属于 线程类。
注意: 此类中所有函数都是 线程安全。
公共函数
QRecursiveMutex() | |
~QRecursiveMutex() | |
void | lock() |
bool | tryLock(int timeout) |
(自 6.6) bool | tryLock(QDeadlineTimer 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]
QRecursiveMutex::QRecursiveMutex()
构造一个新的递归互斥锁。互斥锁以解锁状态创建。
[noexcept]
QRecursiveMutex::~QRecursiveMutex()
销毁互斥锁。
警告:销毁已锁定的互斥锁可能会导致未定义的行为。
[noexcept]
void QRecursiveMutex::lock()
锁定互斥锁。如果另一个线程已锁定互斥锁,则此调用将阻塞,直到该线程将其解锁。
从同一线程多次调用此函数锁定同一互斥锁是允许的。
另请参阅解锁。
[noexcept]
bool QRecursiveMutex::tryLock(int timeout)
尝试锁定互斥锁。如果成功获得锁,该函数返回 true
,否则返回 false
。如果另一个线程已锁定互斥锁,此函数将等待最多 timeout 毫秒直至互斥锁可用。
注意:传递负数作为 timeout 等同于调用 lock(),即如果 timeout 为负,此函数将无限期地等待互斥锁可用。
如果成功获得锁,必须在其他线程成功锁定它之前使用 unlock() 将互斥锁解锁。
从同一线程多次调用此函数锁定同一互斥锁是允许的。
[noexcept,自 6.6 版起]
bool QRecursiveMutex::tryLock(QDeadlineTimer timeout = {})
尝试锁定互斥锁。如果成功获得锁,该函数返回 true
,否则返回 false
。如果另一个线程已锁定互斥锁,此函数将等待,直到 timeout 过期,互斥锁才可用。
如果成功获得锁,必须在其他线程成功锁定它之前使用 unlock() 将互斥锁解锁。
从同一线程多次调用此函数锁定同一互斥锁是允许的。
此功能自 Qt 6.6 版开始引入。
[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() 将互斥锁解锁。
从同一线程多次调用此函数锁定同一互斥锁是允许的。
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() 将互斥锁解锁。
从同一线程多次调用此函数锁定同一互斥锁是允许的。
[noexcept]
void QRecursiveMutex::unlock()
解锁互斥量。如果在加锁互斥量的不同线程中尝试解锁会返回错误。尝试解锁未加锁的互斥量会导致未定义行为。
另请参阅lock()。
© 2024 Qt 公司有限公司。本文档中的文档贡献者分别享有版权。本文档受GNU 自由文档许可证版本 1.3的许可,由自由软件基金会发布。Qt及其相应标志是芬兰和/或其他国家的Qt公司商标。所有其他商标均为其相应所有者财产。