Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: -0.979 c
1-1084021864
vk220
2004-05-08 17:11
2004.05.23
Как отключить отладку стандартных модулей


3-1083218629
direqtor
2004-04-29 10:03
2004.05.23
Ошибка при работе с отчетами Access


3-1082955112
SerKom
2004-04-26 08:51
2004.05.23
Ошибка FreeReport в Win XP: "Can t load package .. FREEREP5.bpl


14-1083791552
saNat
2004-05-06 01:12
2004.05.23
Хоккей. США - Чехия 3-2


7-1082389431
Stefan
2004-04-19 19:43
2004.05.23
Как получить список дочерних процессов ?




   Наверх