Я предполагаю, что вы говорите о классе CCriticalSection в MFC. Я думаю, вы смотрите на правильный критический раздел. Я обнаружил, что количество блокировок критического раздела может стать отрицательным, если количество вызовов функции Lock () меньше, чем количество вызовов Unlock (). Я обнаружил, что это обычно происходит в коде следующего типа:
void f()
{
CSingleLock lock(&m_synchronizer, TRUE);
//Some logic here
m_synchronizer.Unlock();
}
На первый взгляд этот код выглядит совершенно безопасным. Однако обратите внимание, что я использую метод Unlock () CCriticalSection напрямую вместо метода Unlock () CSingleLock. Теперь происходит следующее: когда функция завершается, CSingleLock в своем деструкторе снова вызывает Unlock () критического раздела, и его счетчик блокировок становится отрицательным. После этого приложение будет в плохом состоянии и начнут происходить странные вещи.