Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 22.08.2011, 01:29   #1
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию Крит секции.

Господа кто как ищет в программе взаимо-блокировки которые могут возникнуть при использовании крит секций. Есть для этого какие то специальные методы?

Например у меня в программе есть несколько потоков которые одновременно могут взаимодействуют с несколькими объектами. В каждый объекте есть свои крит секции.
Я заметил что блокировка может как правило возникнуть в следующей ситуации:

Первый поток обращается к первому объекту и использует его крит секцию.
Одновременно второй поток обращается ко второму обхекту с его крит.секц.
Первый поток пытается обратится ко второму обхекту не выходя из крит секции первого. И соответвенно ждет пока из этой к.с. выйдет второй поток.
Второй поток пытается обратится к первому объекту не выходя из к.с. второго. И соответственно все зависает на веки вечные.

Для упрощения работы с крит секциями в каждом обхекте я создал по 2 функции EnterCS и LeaveCS.
Если бы иметь возможность внутри этих функций мониторить состояние крит секций других моих объектов я мог бы хотя бы определить где и что привело к блокировке.
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)
Yegor вне форума   Ответить с цитированием
Старый 22.08.2011, 10:19   #2
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

В нт системах есть tryentercriticalsection в ряде случаев позволяющаяя избежать дедлоков. В идеале постарайся сделать синхронизацию по иерархии чтоб секции порядком выше не вызывались кодом низшего порядка. Если незнаеш где дедлок можеш юзать мутекс - таже секция но можно задать время ожидания и если оно вышло вывести месагу отладочную.

Добавлено через 3 минуты
Зы трайэнтер это посути и есть попытка войти в секцию но проверив ее состояние и если занята не пытатса ее ждать. Как она обернута в делфи хз я vcl не юзаю.
__________________
читернуть бы ништяг

Последний раз редактировалось mira, 22.08.2011 в 10:19. Причина: Добавлено сообщение
mira вне форума   Ответить с цитированием
За это сообщение mira нажился спасибкой от:
Старый 22.08.2011, 11:04   #3
Новичок
 
Регистрация: 24.11.2010
Сообщений: 9
Сказал Спасибо: 3
Имеет 2 спасибок в 2 сообщенях
etoken пока неопределено
По умолчанию

SyncObjs.TCriticalSection.TryEnter не покатит?

з.ы. я нуп на делфях не писал
etoken вне форума   Ответить с цитированием
За это сообщение etoken нажился спасибкой от:
Старый 22.08.2011, 14:24   #4
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

Да есть функция tryentercriticalsection ноне совсем пойму логику ее использования. Выполняя эту функцию я могу сразу знать захвачена эта крит секция другим потоком или нет, если да то какие мои действия, мне ведь все равно нужно в нее войти когда она освободится?
На ум приходит только зацикливать с каким то интервалом tryentercriticalsection пока она не захватит успешно объект крит. секции или пока не истечет какое то время.
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)
Yegor вне форума   Ответить с цитированием
Старый 22.08.2011, 14:37   #5
Новичок
 
Регистрация: 24.11.2010
Сообщений: 9
Сказал Спасибо: 3
Имеет 2 спасибок в 2 сообщенях
etoken пока неопределено
По умолчанию

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

А так Тряй вам поможет с:
"Если бы иметь возможность внутри этих функций мониторить состояние крит секций других моих объектов я мог бы хотя бы определить где и что привело к блокировке." ))
etoken вне форума   Ответить с цитированием
Старый 22.08.2011, 14:51   #6
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

etoken, в смысле в коде моего входа в крит секцию пытаться войти в крит секции других объектов для проверки занятости, например:

bool MyInterCritSect()
{
if (TryEnterCriticalSection(cs2))//проверяем не занята ли крит секция второго объекта
{//если нет
LeaveCriticalSection(cs2);
EnterCriticalSection()cs1);
return true;
}
else
{//если да
ShowMessage("Возможно блокирование ищите ошибку в логике программы");
return(false);
}
}


"Лупится" - это загрузит систему, если вызывать Sleep() то затормозит программу


Вот что по этому поводу пишет некий Oraizer

"Я считаю TryEnterCriticalSection() вообще бесполезной. Идеология критических секций такова, что они призваны защищать инварианты структур данных в пределах одного приложения в предположении, что нарушения инвариантов кратковременны, а значит коллизии случаются редко. Критические секции в отличие от мьютексов очень легки, приложение может их использовать сотнями, тысячами и больше, не особо нагружая систему. Отсюда и некоторые их ограничения, в частности отсутствие таймаутов, невозможность комбинировать их с другими объектами синхронизации и неопределённость поведения системы при несоблюдении правил обращения с ними. В таких исходных условиях TryEnterCriticalSection() может быть полезна в единственном случае - попробовать захватить и отказаться выполнять запрошенное действие в случае неудачи. Ни разу не припомню, чтобы мне понадобился такой сценарий. Всё остальное от лукавого, критические секции в других условиях эксплуатации просто вряд ли вообще подходят.
Средством защиты от deadlocks является отладка. Их просто не должно быть. Обходные пути в лице нарушенных инвариантов - это ещё большее зло."

Источник

Добавлено через 5 минут
Цитата:
Сообщение от etoken Посмотреть сообщение
А так Тряй вам поможет с:
"Если бы иметь возможность внутри этих функций мониторить состояние крит секций других моих объектов я мог бы хотя бы определить где и что привело к блокировке." ))
Как мне поможет Try? Изменить глобальное время ожидания входа в крит секцию в системе InitializeCriticalSectionAndSpinCount() и при исключении долгого ожидания искать ошибки в программе?
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)

Последний раз редактировалось Yegor, 22.08.2011 в 14:53. Причина: Добавлено сообщение
Yegor вне форума   Ответить с цитированием
Старый 22.08.2011, 16:28   #7
Новичок
 
Регистрация: 24.11.2010
Сообщений: 9
Сказал Спасибо: 3
Имеет 2 спасибок в 2 сообщенях
etoken пока неопределено
По умолчанию

Цитата:
Сообщение от Yegor Посмотреть сообщение
Как мне поможет Try? Изменить глобальное время ожидания входа в крит секцию в системе InitializeCriticalSectionAndSpinCount() и при исключении долгого ожидания искать ошибки в программе?
по крайне мере позволит понять в какой момент беда в логике синхронизации. Я имею ввиду использование так как вы описали в примере выше, тупо чекать состояние второй крит. секции, а там уже пытаться "понятть и простить".
etoken вне форума   Ответить с цитированием
За это сообщение etoken нажился спасибкой от:
Старый 22.08.2011, 18:19   #8
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

Цитата:
Сообщение от Yegor Посмотреть сообщение
etoken, в смысле в коде моего входа в крит секцию пытаться войти в крит секции других объектов для проверки занятости, например:

bool MyInterCritSect()
{
if (TryEnterCriticalSection(cs2))//проверяем не занята ли крит секция второго объекта
{//если нет
LeaveCriticalSection(cs2);
EnterCriticalSection()cs1);
return true;
}
else
{//если да
ShowMessage("Возможно блокирование ищите ошибку в логике программы");
return(false);
}
}


"Лупится" - это загрузит систему, если вызывать Sleep() то затормозит программу


Вот что по этому поводу пишет некий Oraizer

"Я считаю TryEnterCriticalSection() вообще бесполезной. Идеология критических секций такова, что они призваны защищать инварианты структур данных в пределах одного приложения в предположении, что нарушения инвариантов кратковременны, а значит коллизии случаются редко. Критические секции в отличие от мьютексов очень легки, приложение может их использовать сотнями, тысячами и больше, не особо нагружая систему. Отсюда и некоторые их ограничения, в частности отсутствие таймаутов, невозможность комбинировать их с другими объектами синхронизации и неопределённость поведения системы при несоблюдении правил обращения с ними. В таких исходных условиях TryEnterCriticalSection() может быть полезна в единственном случае - попробовать захватить и отказаться выполнять запрошенное действие в случае неудачи. Ни разу не припомню, чтобы мне понадобился такой сценарий. Всё остальное от лукавого, критические секции в других условиях эксплуатации просто вряд ли вообще подходят.
Средством защиты от deadlocks является отладка. Их просто не должно быть. Обходные пути в лице нарушенных инвариантов - это ещё большее зло."

Источник

Добавлено через 5 минут


Как мне поможет Try? Изменить глобальное время ожидания входа в крит секцию в системе InitializeCriticalSectionAndSpinCount() и при исключении долгого ожидания искать ошибки в программе?
все прально написал чувак, трайэнтер скорее поможет диагностировать наличие дедлока нежели будет иметь практическое применение.
как я сказал выше постарайся сделать иерархию какуюто и попробуй избежать лишних "секций в секциях".
я трайэнтер не юзал, юзал мутекс с ожиданием скажем в 10 сек - если за это время не удавалось его захватить выводилась мессага о взаимоблокировке в таком-то месте
__________________
читернуть бы ништяг
mira вне форума   Ответить с цитированием
За это сообщение mira нажился спасибкой от:
Старый 22.08.2011, 20:12   #9
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Цитата:
Если бы иметь возможность внутри этих функций мониторить состояние крит секций других моих объектов я мог бы хотя бы определить где и что привело к блокировке.
eurekalog. поможет если дезлочиться основной поток приложения.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился 2 спасибками от:
Старый 23.08.2011, 02:00   #10
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

хм, чего не писал ещё ни разу не возникало необходимости использовать критические секции внутри критической секции, в связи с чем ни о каких взаимных блокировках и думать не приходиться)
имхо любую задачу можно реализовать без вложенных критических секций...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 15:38.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!