Критические секции с таймаутом очень удобны при отладке приложений. В случае возникновения блокировки срабатывает таймаут, и вылетает исключение, позволяющее легко определить где именно произошла блокировка.
Стандартные критические сеации таймауты не поддерживают - секции с таймаутом нужно реализовывать самостоятельно. На RSDN есть отличная статья на эту тему - Критические секции. В ней приведен вариант реализации критических секций с таймаутом (см. листинг 14). Код дан на С++. Я портировал этот код на Delphi и, на его основе, реализовал класс TCriticalSectionDbg. Этот класс можно использовать при отладке вместо TCriticalSection (замену удобно проводить с помощью директив условной компиляции). Выкладываю исходные коды. Если вы обнаружите в них ошибку, пожалуйста сообщите о ней в комментариях, буду очень признателен.
К исходникам TCriticalSectionDbg приложен тестовый проект на Delphi 2010, демонстрирующий блокировку потоков, а так же аналогичный С++-ный проект (можно сравнивать результаты работы функций построчно). Мне этот проект потребовался при портировании вызова функции InterlockedCompareExchangePointer, который в Delphi оказался несколько, гм.. нетривиален.
Скачать исходные коды TCriticalSectionDbg.
Комментариев нет:
Отправить комментарий