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()