Отладка приложений

       

Постоянный просмотр кода


Если приложение действительно нуждается в мультипоточности, то приходится тратить много времени на полный просмотр его кода. Данный прием заключается в том, чтобы для подобных обзоров прикрепить по одному человеку на каждый поток и на каждый объект синхронизации в коде. Во многих отношениях обзор кода в многопоточном программировании — действительно "многопоточный" обзор.

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

Работая с обзором кода, имейте в виду, что операционная система имеет свои собственные объекты синхронизации, которые она применяет к вашему процессу, и эти объекты также могут вызвать блокировки. Критическая секция процесса, объясненная ниже в примечании "История отладочной войны. Блокировка не имеет смысла" данной главы, и печально известные 16-разрядные мьютексы из Windows 98 являются объектами синхронизации, которые операционная система использует в вашем процессе. Если не проявлять осторожности, то причиной блокировок может также быть и обработка сообщений. Если поток А — это UI-поток, ожидающий критическую секцию, в настоящее время принадлежащую потоку В, и если поток В посылает сообщение HWND-объекту в поток А с помощью функции SendMessage, то произойдет блокировка. Убедитесь, что контролировали эти действия во время обзора кода.

Мьютекс (miitex object) — специальный синхронизирующий объект в межпроцессном взаимодействии, подающий сигнал, когда он не захвачен каким-либо потоком. — Пер.



Содержание раздела