直接上代码,直观明了。总结在此,避免再次踩坑。
//1.锁的作用域过大引起的死锁
如果异常根源处的大括号不启用,调用stop()时,锁一直被占用,
因为m_bRuning一直为true,死循环。此处等待m_bRuning为false;
而根源相关处等待锁释放,才能将m_bruning置为false;
一处等待m_bruning置为false;才能释放锁;一处等待锁释放,才能将
m_bruning置为false; 相互等待,最终死锁!
void StationBThread::stop()
{
m_pCtrl->setQuitFlag(m_id,true);
//{ 异常根源
QMutexLocker locker(&m_Mutex);
m_bStop = true;
//} 异常根源
int nStep = 10;
int count = (60 * 1000) / nStep;
while (m_bRuning)
{
QThread::msleep(10);
if (--count <= 0)
break;
}
}
void StationBThread::run()
{
m_bRuning = true;
while (true)
{
while (!m_pCtrl->IsStationHasTask(m_id))
{
QThread::msleep(2);
QApplication::processEvents();
{
QMutexLocker locker(&m_Mutex); 根源相关
if(m_bStop)
break;
}
}
{
QMutexLocker locker(&m_Mutex);
if (m_bStop) 根源相关
break;
}
m_pCtrl->ResetStationTask(m_id);
if (m_pCtrl->HasStuff(m_id))
{
// Do some thing......
goto rest;
}
else
{
// Do some thing......
goto rest;
}
rest:
{
m_pCtrl->asyncWait(10);
QMutexLocker locker(&m_Mutex); 根源相关
if (m_bStop)
break;
}
}
m_bRuning = false;
m_bStop = false;
}
//2.锁的嵌套导致死锁
此处比较简单,就不做过多分析,一般锁只作用于最基础需要保护的内存数据
Func A()
{
QMutexLocker locker(&m_Mutex); //已占有锁
Func B();
}
Func B()
{
QMutexLocker locker(&m_Mutex); //等待锁
//Do some thing......
}