Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
Анонимщик ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.03 c
8-1078340694
3APA3A
2004-03-03 22:04
2004.05.23
Как экран сохранить в JPEG?


7-1081617380
CAHEK
2004-04-10 21:16
2004.05.23
Как в XP перезагрузить комп???


11-1057565898
mox
2003-07-07 12:18
2004.05.23
NMSMTP


3-1082982964
avgur
2004-04-26 16:36
2004.05.23
вопрос доступа к данным в сети


6-1081284805
Rander
2004-04-07 00:53
2004.05.23
Http Encode





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский