Главная страница
    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.051 c
14-1083303159
blackman
2004-04-30 09:32
2004.05.23
Что с усовершенствованием FAQ ? Усовершенствовали что-ли уже ?


14-1083249319
Goida
2004-04-29 18:35
2004.05.23
А мне только что досталась лицензионная версия Borland C++!!!


1-1084103079
Islander
2004-05-09 15:44
2004.05.23
Мигание формы при изменении Position


3-1083223942
r9000
2004-04-29 11:32
2004.05.23
Вопрос по использованию ADO


4-1080803647
melnikov ivan
2004-04-01 11:14
2004.05.23
Как пользоваться функцией VirtualQueryEx()?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский