Отрицательное число блокировок - нормальное поведение в некоторых версиях Windows. Обратите внимание, что значение этого поля изменилось за время существования Windows (см. Ниже).
Интерпретация этих закрытых полей - дело сложное, и вы можете извлечь выгоду из использования специальных инструментов отладки критических секций.
Например, см. Эту статью MSDN , которая дает некоторые подробности. В частности, я думаю, что это показывает, почему значение -6 вполне вероятно.
Некоторые соответствующие выдержки:
Критические разделы могут отображаться в пользовательском режиме различными способами. Точное значение каждого поля зависит от версии используемой вами версии Microsoft Windows.
......
В Microsoft Windows 2000 и Windows XP поле LockCount указывает количество раз, которое какой-либо поток вызывал подпрограмму EnterCriticalSection для этого критического раздела, минус один. Это поле начинается с -1 для разблокированного критического раздела. Каждый вызов EnterCriticalSection увеличивает это значение; каждый вызов LeaveCriticalSection уменьшает его. Например, если LockCount равен 5, этот критический раздел заблокирован, один поток получил его, и пять дополнительных потоков ожидают эту блокировку.
......
В Microsoft Windows Server 2003 с пакетом обновления 1 и более поздних версиях
В Windows поле LockCount анализируется следующим образом:
- Самый младший бит показывает состояние блокировки. Если этот бит равен 0, критический
раздел заблокирован; если это 1, критическая секция не заблокирована.
- Следующий бит показывает, проснулся ли поток для этой блокировки. Если
этот бит равен 0, тогда для этой блокировки был пробужден поток; если это 1,
ни одна нить не проснулась.
- Остальные биты являются единицами числа потоков
в ожидании блокировки.
Далее объясняется, как интерпретировать счетчик блокировок -22
. Итак, в целом, это сложнее, чем вы думаете!