Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Критические секции   Найти похожие ветки 

 
Анонимщик ©   (2004-05-06 18:18) [0]

Попал в ситуацию взаимной блокировки. Но не могу найти места. Подскажите, будьте любезны, есть ли какие утилиты для обнаружения этого момента.


 
Digitman ©   (2004-05-06 18:22) [1]

насчет утилит не знаю, но если перехватить точки входа в Enter/LeaveCS, то ведя лог можно достаточно просто локализовать "узкое место"


 
clickmaker ©   (2004-05-06 18:25) [2]

Веди лог входов/выходов в КС


 
Анонимщик ©   (2004-05-06 18:29) [3]

Да блин задолбало, уже не помню, какой файл чего логгирует.


 
Romkin   (2004-05-06 18:30) [4]

Это хороший повод сделать реинжиниринг. Перевожу: переписать все нафиг :)


 
Анонимщик ©   (2004-05-06 18:35) [5]

Ну-ну.
Спасибо на добром слове.


 
Digitman ©   (2004-05-06 18:38) [6]


> Анонимщик ©   (06.05.04 18:29) [3]
> Да блин задолбало


раз "задолбало", раз изначально ты грамотно не структурировал свой сквозной алгоритм, раз "переписать фсе нафих" малореально, то выход - прислушайся ! - один : перехвать точек входа в API-интерфейс управления CS и вести там централизованный лог ... всего-то  каких-то 2 ф-ции перехватить ! подумай !


 
Анонимщик ©   (2004-05-06 18:56) [7]

Спасибо, это уже намного лучше. Но еще лучше утилита какая.


 
Alex Konshin ©   (2004-05-06 19:00) [8]

Главные правила использования критических секций:
1. Использовать try ... finally
2. Минимизировать количество критических секций. Понятно, что злоупотребление этим правилам может привести к неоправданным ожиданиям, но зато оно и уменьшает риск (если не сводит к нулю) взаимных блокировок.
3. Вложенные блокировки в разных местах обязательно должны происходить в одинаковом порядке. То есть, если у вас есть две критические секции A и B, то проследите, что при всех возможных сценариях у вас всегда сначала блокируется А, потом блокирется B, и нет ситуций, когда B блокируется раньше, чем A.
Именно нарушение этого правила и приводит к взаимным блокировкам.


 
Alex Konshin ©   (2004-05-06 19:12) [9]

Digitman ©   (06.05.04 18:38) [6]
> Анонимщик ©   (06.05.04 18:29) [3]
> Да блин задолбало
раз "задолбало", раз изначально ты грамотно не структурировал свой сквозной алгоритм, раз "переписать фсе нафих" малореально, то выход - прислушайся ! - один : перехвать точек входа в API-интерфейс управления CS и вести там централизованный лог ... всего-то  каких-то 2 ф-ции перехватить ! подумай !

Можно проще и без тяжелой артилерии.
Наверняка ты пишешь просто EnterCriticalSection и т.п. без указания Windows. Тогда пройдет такой способ:
Просто создай некий свой юнит. Вставь его самым первым в uses всех модулей, где ты используешь критические секции (можешь даже использовать условную компиляцию, чтоб потом проще отключить было). В этом модуле опиши свои процедуры EnterCriticalSection и LeaveCriticalSection, которые, например, пишут что-то в лог, а потом вызывают соответствующую функцию Win32 API (не забудь префикс Windows).

Прелесть этой методики в потом, что тут не нужно знать как осуществлять перехват API функций, все на уровне знания Delphi.


 
Анонимщик ©   (2004-05-06 19:47) [10]

Только все равно нужно знать стек, пардон.


 
Alex Konshin ©   (2004-05-06 20:01) [11]

Со стеком тебе может помочь Debug из JCL.



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-1083825060
Term
2004-05-06 10:31
2004.05.23
List Index out of bounds(1)


14-1083442276
RealRascal
2004-05-02 00:11
2004.05.23
Придумываение замысловатых паролей.


7-1081846899
_Андрей
2004-04-13 13:01
2004.05.23
как из своей программы обработать Popup сообщение?


6-1080366633
Energizer
2004-03-27 08:50
2004.05.23
Винсоки. Формирование пакетов


4-1081015410
DillerXX
2004-04-03 22:03
2004.05.23
Работает ли WindowFromPoint для кнопок?