Qt QMutexLock自動ロック解除機構
QMutexLocker自動ロック解除機構
QMutexLockerは便利なクラスで、QMutexに自動的にロックとロックを解除することができます.QMutexLockerが申請したこのlock変数は、この関数が終了すると、自動的に構造関数を呼び出してロックを解除するためです.これにより、プログラム作成中に異なる箇所に複数のreturnがある場合、returnが発生した場合にロックが解除されず、プログラムがデッドロックすることを防止することができる.以下に、上記の2つのクラスをそれぞれ使用した例を示します.一、QMutex int complexFunction(int flag){mutex.lock();
}
二、QMutexLockerの使用
三、Qmutex反発量が複数回使用される場合、QMutexLockerは再ロック及びロック解除を必要とする
QMutexLockerは便利なクラスで、QMutexに自動的にロックとロックを解除することができます.QMutexLockerが申請したこのlock変数は、この関数が終了すると、自動的に構造関数を呼び出してロックを解除するためです.これにより、プログラム作成中に異なる箇所に複数のreturnがある場合、returnが発生した場合にロックが解除されず、プログラムがデッドロックすることを防止することができる.以下に、上記の2つのクラスをそれぞれ使用した例を示します.一、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()