Главная страница
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
14-1083604338
Delphi5.01
2004-05-03 21:12
2004.05.23
существовал такой сайт www.Flasher.ru ...


1-1083830145
Iraizor
2004-05-06 11:55
2004.05.23
TRichEdit , склейка разноцветных строк.


1-1084342715
AngelSAI
2004-05-12 10:18
2004.05.23
Вывод вертикального текста


8-1078912912
$tranger
2004-03-10 13:01
2004.05.23
GIF-картинки


14-1083782911
Drakon
2004-05-05 22:48
2004.05.23
Песни о Software