То, о чем вы говорите, имеет смысл во время тестирования, но не реально выполнимо в производственном коде.
Я имею в виду ... вы МОЖЕТЕ делать что-то в производственном коде, например, определять значения LockCount и RecursionCount (это задокументировано), вычитать RecursionCount из LockCount и presto, у вас есть число потоков, ожидающих, чтобы попасть в CRITICAL_SECTION объект.
Возможно, вы даже захотите пойти глубже. Структура RTL_CRITICAL_SECTION_DEBUG задокументирована в SDK. Единственное, что когда-либо изменилось в отношении этой структуры, - это то, что некоторым зарезервированным полям были присвоены имена и они были использованы. Я имею в виду ... это в заголовках SDK (winnt.h), документированные поля НЕ меняются. Вы неправильно поняли историю Рэймонда. (Он частично виноват, ему нравится ощущение так же, как и следующему парню.)
Мой общий смысл: если в вашем приложении есть серьезная конкуренция за блокировку, вы должны, конечно, вывести это из себя. Но никогда не делайте код внутри критического раздела больше, если вы можете избежать этого. А чтение структуры отладки (или даже lockcount / recursioncount) должно происходить только тогда, когда вы держите объект. Это нормально в отладочной / тестовой версии, но не должно запускаться в производство.