QMutexLocker

  QMutexLocker 是一个工具类,它能非常方便地将互斥量锁定以及解锁。更多内容…

属性 内容
头文件 #include <QMutexLocker>
qmake QT += core

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

公共成员函数

返回类型 函数
QMutexLocker(QRecursiceMutex *mutex)
QMutexLocker(QMutex *mutex)
~QmutexLocker()
QMutex * mutex() const
void relock()
void unlock()

详细描述

  在复杂的函数、语句或异常处理代码中锁定和解锁 QMutex 很容易出错,而且很难调试。QMutexLocker 可用于此类情况,以确保互斥量的状态始终定义良好。

  QMutexLocker 应该在需要锁定 QMutex 的函数中创建。在创建 QMutexLocker 时互斥量被锁定。您可以使用 unlock()relock() 解锁和重新锁定互斥体。如果锁定,则当 QMutexLocker 被销毁时,互斥量将被解锁。

  例如,此复杂函数在进入函数时锁定 QMutex,并在所有出口点解锁互斥量:

  1. int complexFunction(int flag)
  2. {
  3. mutex.lock();
  4. int retVal = 0;
  5. switch (flag) {
  6. case 0:
  7. case 1:
  8. retVal = moreComplexFunction(flag);
  9. break;
  10. case 2:
  11. {
  12. int status = anotherFunction();
  13. if (status < 0) {
  14. mutex.unlock();
  15. return -2;
  16. }
  17. retVal = status + flag;
  18. }
  19. break;
  20. default:
  21. if (flag > 10) {
  22. mutex.unlock();
  23. return -1;
  24. }
  25. break;
  26. }
  27. mutex.unlock();
  28. return retVal;
  29. }

  该示例在开发过程中会变得更加复杂,也更加容易出错。   使用 QMutexLocker 可大大简化代码,且可读性更好:

  1. int complexFunction(int flag)
  2. {
  3. QMutexLocker locker(&mutex);
  4. int retVal = 0;
  5. switch (flag) {
  6. case 0:
  7. case 1:
  8. return moreComplexFunction(flag);
  9. case 2:
  10. {
  11. int status = anotherFunction();
  12. if (status < 0)
  13. return -2;
  14. retVal = status + flag;
  15. }
  16. break;
  17. default:
  18. if (flag > 10)
  19. return -1;
  20. break;
  21. }
  22. return retVal;
  23. }

 现在,当 QMutexLocker 对象被销毁时(当函数返回时,因为 locker 是一个栈变量),互斥量将始终被解锁。

  同样的原则也适用于抛出和捕获异常的代码。在将异常传递给调用函数之前,如果函数未在锁定互斥量的函数中捕获到异常,则无法解锁互斥体。

译者注:在进入被调函数后,被调函数锁定互斥量(使用QMutex::lock()),在执行过程中发生异常,异常被调用函数获取,被调函数就没有正确执行解锁。

  QMutexLocker 还提供一个 mutex() 成员函数,该函数返回QMutexLocker 正在其上操作的互斥体。这对于需要访问互斥体的代码非常有用,例如 QWaitCondition::wait()。例如:

  1. class SignalWaiter
  2. {
  3. private:
  4. QMutexLocker locker;
  5. public:
  6. SignalWaiter(QMutex *mutex)
  7. : locker(mutex)
  8. {
  9. }
  10. void waitForSignal()
  11. {
  12. ...
  13. while (!signalled)
  14. waitCondition.wait(locker.mutex());
  15. ...
  16. }
  17. };

另请参阅: QReadLockrQWriteLockerQMutex

成员函数文档

QMutexLocker::QMutexLocker(QRecursiveMutex *mutex)

  构造一个 QMutexLocker 并锁定互斥量。当 QMutexLocker 被销毁时,互斥量将被解锁(unlock())。如果 mutex 为空,那么 QMutexLocker 不执行任何操作。

  在 Qt5.14 中引入该函数。

另请参阅: QMutex::lock()


QMutexLocker::QMutexLocker(QMutex *mutex)

   构造一个 并锁定互斥量。当 QMutexLocker 被销毁时,互斥量将被解锁。如果 mutex 为空,那么 QMutexLocker 不执行任何操作。

另请参阅: QMutex::lock()


QMutexLocker::~QMutexLocker()

  销毁 QMutexLocker 并解除锁定构造函数中锁定的互斥量。

另请参阅: QMutex::unlock()

QMutex *QMutexLocker::mutex() const

  返回 QMutexLocker 正在操作的互斥量。


void QMutexLocker::relock()

  重新锁定,未上锁的互斥量。

另请参阅: unlock()


void QMutexLocker::unlock()

  解锁这个互斥量。您可以使用 relock() 再次锁定它。销毁时不需要锁定。

另请参阅: relock()