我在一个函数中是这样写的:
<!-- lang: cpp -->
//错误代码
::EnterCriticalSection( &cs );
CVariety* cva = gVarietyManager.LookUp(conTmp);
if (cva == NULL)
return;
//....其他
::LeaveCriticalSection( &cs );
这段程序是错误的,因为在没有离开临界区就返回了,导致程序死锁. 所以,写多线程程序的时候,检查每条返回路径,看看是不是在程序返回之前都离开了临界区.
<!-- lang: cpp -->
//修改
::EnterCriticalSection( &cs );
CVariety* cva = gVarietyManager.LookUp(conTmp);
if (cva == NULL)
{
::LeaveCriticalSection( &cs );//在函数返回之前离开临界区
return;
}
//....其他
::LeaveCriticalSection( &cs );
一定要记住:不要在函数离开临界区之前返回