Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[UPD] хм.. 05.08.05 22:08 Число просмотров: 1958
Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 05.08.05 23:43 Количество правок: 7
|
Я еще больший ламер в 1С, тк у меня даже знакомых оттуда нету, так что о внутренностях могу судить только по этой ветке.
Спрашивается а почему нельзя было сделать так:
for(;;)
{
Лочим глобальный лок (EnterCriticalSection(&global_lock))
Делаем ReleaseSemaphore(sem1,1,0);
Поочредено пытаемся захватить и залочить все нужные ресурсы (WaitoFrSingleObject(res_mutex[i],0)==WAIT_OBJECT_0)
Если гдето обломались - разлочиваем всех уже залоченных. И ставим флаг успешного лока в false.
Если лок получился успешный - WaitForSingleObject(sem1,0);
Разлочиваем глобальный лок (LeaveCriticalSection(&global_lock))
Если лок получился успешный - break;
Иначе делаем WaitForSingleObject(sem2,INFINITE); и продолжаем цикл
}
Когда лочный цикл сработал:
{
работаем с ресурсами (пишем,читаем), при освобождении каждого ресурса делаем:
EnterCriticalSection(&global_lock);
while(WaitForSingleObject(sem1,0)==WAIT_OBJECT_0)ReleaseSemaphore(sem2);
LeaveCriticalSection(&global_lock);
}
Просто надо сделать не глобальный лок, а чтобы процедура лочения всех ресурсов сама по себе была атомарной. Тогда не будет дребезга и дедлоков. Недостатком такого метода будет то что при разлочке каждого ресурса лочный цикл будет прокручиваться один раз для каждого ожидающего потока, что легко лечится введением ресурсных индексов для sem1 и sem2 - при этом прокручиваться будут только те потоки, которые заинтересованы в освободившемся ресурсе. А если еще немного подумать то можно организовать очередь, в которой поток которых хочет захватить ресурсы A, E, G - - вначале быстренько проверяет в критической секции их доступность и если ктото занят - пушит в list этакую структурку - "хочу A, E, G, когда они освободяться прошу разбудить меня вот этим Event'ом". А при разлочке любого ресурса анализировать очередь, кому там что надо, и самому "старому" подходящему кандидату сигналить семафор. А потому другому старому если таковой найдеться. И так далее. Естественно процедурку проверки и сигналения семафоров - в критическую секцию. В туже самую что и начальную проверку потоком доступности нужных ему ресурсов перед засыпанием.
Но это конечно к разработчикам 1С, нежели к кракерам..
ЗЫ Эх блин почему многие программеры так хреново соображают в многопоточности..
|
|
|