Если вы хотите сделать это правильно, я думаю, что вы использовали объект-оболочку вокруг ваших критических секций, который будет отслеживать, какой поток (если таковой имеется) владеет каждым CS в отладочных сборках.
т.е. вместо прямого вызова EnterCriticalSectionВы бы вызвали метод в вашей обертке, который выполнил EnterCriticalSection, а затем, при успешном выполнении, сохранил GetCurrentThreadId в DWORD, который проверят утверждения.Другой метод обнуляет этот идентификатор потока DWORD перед вызовом LeaveCriticalSection.
(В сборках релиза оболочка, вероятно, пропустит лишние вещи и просто вызовет Enter / LeaveCriticalSection.)
Как указывает Касабланка,идентификатор потока владельца находится в текущей структуре CRITICAL_SECTION, поэтому использование оболочки, как я предлагаю, будет хранить избыточную информацию.Но, как указывает Касабланка, структура CRITICAL_SECTION не является частью какого-либо контракта API и может измениться.(Фактически, изменилось в предыдущих версиях Windows.)
Знание внутренней структуры полезно для отладки, но не должно использоваться в производственном коде.
Так чтоМетод, который вы используете, зависит от того, насколько «правильным» будет ваше решение.Если вам просто нужны временные подтверждения для отслеживания проблем сегодня, в текущей версии Windows, то использование полей CRITICAL_SECTION напрямую мне кажется разумным.Только не ожидайте, что эти утверждения будут действительны вечно.Если вы хотите что-то, что будет работать дольше, используйте оболочку.
(Другое преимущество использования оболочки - получение RAII. Т.е. конструктор и деструктор оболочки будут заботиться о вызовах InitializeCriticalSection и DeleteCriticalSection, поэтомувам больше не нужно беспокоиться о них. Говоря об этом, я считаю чрезвычайно полезным иметь вспомогательный объект, который входит в CS при построении, а затем автоматически оставляет его при разрушении. Больше нет критических секций, случайно оставленных заблокированными, потому что функция имела раннийвернуть спрятанный в середине этого ...)