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