QMutexLocker 类是简化锁定和解锁互斥的方便类。 更多...
头: | #include <QMutexLocker> |
CMake: |
find_package(Qt6 COMPONENTS Core REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
注意: 此类的所有函数 thread-safe .
QMutexLocker (Mutex * mutex ) | |
~QMutexLocker () | |
Mutex * | mutex () const |
void | relock () |
void | unlock () |
锁定和解锁 QMutex or QRecursiveMutex 在复杂函数、语句 (或异常处理) 中,代码容易出错且难以调试。QMutexLocker 可以用于这种状况以确保互斥状态始终定义良好。
应该在函数内创建 QMutexLocker,那里
QMutex
需要被锁定。互斥被锁定当 QMutexLocker 被创建时。可以解锁和重新锁定互斥采用
unlock()
and
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 .
构造 QMutexLocker 和锁
mutex
。互斥会被解锁当 QMutexLocker 被销毁时。若
mutex
is
nullptr
,QMutexLocker 什么都不做。
另请参阅 QMutex::lock ().
销毁 QMutexLocker 并解锁在构造函数中被锁定的互斥。
另请参阅 QMutex::unlock ().
返回互斥在那里 QMutexLocker 正在运转。
重新锁定被解锁的互斥锁定器。
另请参阅 unlock ().
解锁此互斥锁定器。可以使用
relock()
以再次锁定它。它不需要被锁定当销毁时。
另请参阅 relock ().