Обход цепочки ожидания

Обход цепочки ожидания (WCT) позволяет отладчикам диагностировать зависания приложения и взаимоблокировки.

Цепочка ожидания — это чередующаяся последовательность потоков и объектов синхронизации, где каждый поток ожидает следующего объекта. Каждый следующий объект, в свою очередь, принадлежит последующему потоку в цепочке.

Поток ожидает объекта синхронизации от времени, когда поток запрашивает объект до его получения. Эта блокировка принадлежит потоку с момента получения потока до тех пор, пока поток не выпустит его. Другими словами, когда поток 1 ожидает блокировки, принадлежащей потоку 2, поток 1 ожидает потока 2.

WCT поддерживает следующие примитивы синхронизации:

Чтобы получить цепочку ожидания для одного или нескольких потоков, создайте сеанс WCT с помощью функций OpenThreadWaitChainSession и GetThreadWaitChain . Сеансы WCT представлены дескриптором типа HWCT.

Сеансы могут быть синхронными или асинхронными

Вы не можете отменить синхронные сеансы и заблокировать вызывающий поток до получения цепочки ожидания.

Асинхронные сеансы не блокируют вызывающий поток и могут быть отменены приложением с помощью функции CloseThreadWaitChainSession . Результаты асинхронных операций предоставляются с помощью функции обратного вызова WaitChainCallback , предоставляемой приложением.

Для асинхронных сеансов вызывающий объект может указать указатель на структуру данных контекста с помощью GetThreadWaitChain. Этот же указатель передается функции обратного вызова WaitChainCallback .

Структура данных контекста определяется пользователем и непрозрачна для WCT. Структура данных контекста может использоваться приложением для обмена данными между запросом WCT и функцией обратного вызова. Как правило, вы передаете дескриптор событий через эту структуру и при выполнении обратного вызова это событие сигнализируется, а поток мониторинга сообщает о завершении запроса.

Пример обхода цепочки ожидания см. в разделе "Использование WCT".

См. также