QMutexLocker 类
template <typename Mutex> class QMutexLockerQMutexLocker 类是一个方便类,它简化了互斥锁的锁定和解锁操作。 更多信息...
头文件 | #include <QMutexLocker> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 包括所有成员的列表,包括继承的成员
- QMutexLocker 是 线程类 的一部分。
注意: 本类中所有函数都是 线程安全。
公共函数
QMutexLocker(Mutex *mutex) | |
(自 6.4 版起) | QMutexLocker(QMutexLocker<Mutex> &&other) |
~QMutexLocker() | |
(自 6.4 版起) bool | isLocked() const |
Mutex * | mutex() const |
void | relock() |
(自 6.4 版起) void | swap(QMutexLocker<Mutex> &other) |
void | unlock() |
(自 6.4 版起) QMutexLocker<Mutex> & | operator=(QMutexLocker<Mutex> &&other) |
详细描述
在复杂函数和语句或异常处理代码中锁定和解锁 QMutex 或 QRecursiveMutex 可能会导致错误并且难以调试。QMutexLocker 可用于此类情况,以确保互斥锁的状态始终明确。
应在需要锁定 QMutex 的函数内创建 QMutexLocker。当 QMutexLocker 被创建时,互斥锁将被锁定。您可以使用 unlock()
和 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.
成员函数文档
[显式 noexcept]
QMutexLocker::QMutexLocker(Mutex *mutex)
构建一个 QMutexLocker 并锁定 mutex。当 QMutexLocker 被销毁时,将解锁互斥锁。如果 mutex 为 nullptr
,则 QMutexLocker 不执行任何操作。
另请参阅 QMutex::lock.
[noexcept,自 6.4]
QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)
从 other 移除构建一个 QMutexLocker。互斥锁和 other 的状态将转移到新构建的实例。移动后,other 将不再管理任何互斥锁。
此功能自 Qt 6.4 以来已推出。
另请参阅 QMutex::lock.
QMutexLocker::~QMutexLocker()
销毁 QMutexLocker 并解锁在构造函数中锁定的互斥锁。
另请参阅 QMutex::unlock.
[noexcept,自 6.4]
bool QMutexLocker::isLocked() const
如果此 QMutexLocker 正在锁定关联的互斥锁,则返回 true,否则返回 false。
此功能自 Qt 6.4 以来已推出。
Mutex *QMutexLocker::mutex() const
返回 QMutexLocker正在操作的互斥锁。
[noexcept]
void QMutexLocker::relock()
重新锁定未锁定的互斥锁。
另请参阅 unlock.
[noexcept,自 6.4]
void QMutexLocker::swap(QMutexLocker<Mutex> &other)
交换此 QMutexLocker 与 other 的互斥锁和状态。此操作非常快速且永远不会失败。
此功能自 Qt 6.4 以来已推出。
另请参阅 QMutex::lock.
[noexcept]
void QMutexLocker::unlock()
解锁此互斥锁。您可以使用 relock()
再次锁定它。销毁时不需要锁定。
另请参阅 relock.
[noexcept,自 6.4]
QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)
将 other 移除到本 QMutexLocker。如果在本赋值之前此 QMutexLocker 持有一个已锁定的互斥锁,则将解锁该互斥锁。然后,将 other 的互斥锁和状态转移到此 QMutexLocker。移动后,other 将不再管理任何互斥锁。
此功能自 Qt 6.4 以来已推出。
另请参阅 QMutex::lock.
版权所有©2024 Qt公司有限公司。本文件中包含的文档贡献是各自所有者的知识产权。本文件提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款许可的。Qt及其相关标志是芬兰及/或其他国家和地区的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。