Qt QMutexLock 自动解锁机制

本文介绍了QMutexLocker类在Qt中的使用方法及其优势。通过对比QMutex的手动加锁和解锁过程,展示了QMutexLocker如何简化代码并避免程序死锁的问题。同时,通过具体的代码示例说明了在复杂函数中使用QMutexLocker可以有效减少代码冗余并提高程序的健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QMutexLocker 自动解锁机制

QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁。因为QMutexLocker 申请的这个lock变量在这个函数退出时,自动的调用析构函数来解锁。这样可以防止在程序编写的过程中,不同的地方有多个return的情况,在发生return的时候,没有解锁,导致程序死锁。
下面是一个例子,分别使用了以上两个类。
一、使用QMutex
int complexFunction(int flag)
{
mutex.lock();

 int retVal = 0;

 switch (flag) {
 case 0:
 case 1:
      mutex.unlock();
      return moreComplexFunction(flag);
  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;
  }

三、Qmutex互斥量 被多次使用时, QMutexLocker 需要重新加锁及解锁

def _get_data_in(self):
        while True:
            if not self._pause:
                QMutexLocker(self._mutex).relock()
                package = None
                try:
                    package = self._udp_receiver.get_last_data()
                    self._extract_and_distribute_data(package)
                except AttributeError:
                    pass
                finally:
                    self._last_packet = package[0] if package is not None else None
                    QMutexLocker(self._mutex).unlock()
            sleep(0.01)
def _get_data(self, type=0):
QMutexLocker(self._mutex).relock()
        try:
            if type == 1:
                if len(self._data_logging):
                    return self._data_logging
                else:
                    return None
            elif type == 2:
                if isinstance(self._data_STA, StratGeneralAcc):
                    return self._data_STA.data
                return None
            elif type == 3:
                return self._data_draw
            else:
                raise NotImplemented
        finally:
            QMutexLocker(self._mutex).unlock()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值