QMutexLocker官方帮助文档-详细介绍部分(个人翻译)


详细介绍:
在复杂的函数和声明中,在异常处理的编码中,锁定和解锁一个QMutext对象不但很容易犯错,还很难调试。
下面的QMutexLocker使用场景,会告诉你如何恰当地定义互斥体(mutex)的状态。
函数中,哪里需要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对象是一个auto变量,函数返回时,对象自动被析构摧毁,互斥体随之自动解锁。
该原理同样也适用于抛出和捕获异常的编码。
一个函数,若已锁定互斥体,但却没有捕获到函数内发生的异常,
那么只有当异常被传递到调用它的函数的栈空间时,互斥体才能被解锁。
QMutexLocker也提供了用于QMutexLocker运行过程中返回互斥体的成员函数。
像QWaitCondition::wait(),这样需要访问互斥体的编码,该成员函数非常有用。
例子:

  class SignalWaiter
  {
  private:
      QMutexLocker locker;

  public:
      SignalWaiter(QMutex *mutex)
          : locker(mutex)
      {
      }

      void waitForSignal()
      {
          ...
          while (!signalled)
              waitCondition.wait(locker.mutex());
          ...
      }
  };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值