информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыВсе любят медСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / job
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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С, нежели к кракерам..

ЗЫ Эх блин почему многие программеры так хреново соображают в многопоточности..
<job> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach