Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

разделение общего ресурса на несколько потоков


Страницы:   1 2

supervk ©   (2006-08-31 05:17:00) 

Есть приложение, в котором работает несколько потоков. И есть общий ресурс, к которому не должен осуществляться одновременный доступ нескольких потоков, а только поочерёдно.

Правильно ли будет разделит его таким образом:

while( !fl_stop )
begin
    WaitForSingleObject(ResourceFree, INFINITE);
    ResetEvent(ResourceFree);
    [... код использующий общие ресурсы ...]
    SetEvent(ResourceFree);
end;
где ResourceFree - общий handle.

Возникает мысль, что все потоки одновременно выйдут из WaitForSingleObject. Если это так, то каким образом лучше сделать такое разделение общего ресурса?


supervk   (2006-08-31 09:27:00) [21]


> medved_68 ©
> > Для пущей уверенности убрал сброс ResetEvent и установил
> > флаг bManualReset=False в CreateEvent, создающем handle
> > ResourceFree.
> Ну тогда точно выйдут!!!! А флаг то в автомат нафига перевел?

В MSDN написано по поводу bManualReset :
Boolean that specifies whether a manual-reset or auto-reset event object is created. If TRUE, then you must use the ResetEvent function to manually reset the state to nonsignaled. If FALSE, the system automatically resets the state to nonsignaled after a single waiting thread has been released.

Я это понял так: событие автоматически сбросится после того, как на него сработает первый же ждущий его поток.
Т.е. первый WaitForSingleObject, ожидающий его, после срабатывания снова сбросит (отключит) этот event.

Я неправильно понял?


medved_68   (2006-08-31 09:25:00) [22]

Сергей М.
> но в ряде случаев м.б. неприменимо из-за блокирования нити


> begin
>     WaitForSingleObject(ResourceFree, INFINITE);

А это не блокирование нити???? И возможно, опять же по ряду причин, "навечно" :)


Сергей М.   (2006-08-31 09:18:00) [23]


> medved_68 ©   (31.08.06 08:57) [4]
> для поочередности существует такая весчь как критическая
> секция


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


medved_68   (2006-08-31 08:57:00) [24]

А для поочередности существует такая весчь как критическая секция


medved_68   (2006-08-31 08:55:00) [25]


> Для пущей уверенности убрал сброс ResetEvent и установил
> флаг bManualReset=False в CreateEvent, создающем handle
> ResourceFree.

Ну тогда точно выйдут!!!! А флаг то в автомат нафига перевел????


supervk   (2006-08-31 07:11:00) [26]


>atruhin
> Не бойся не выйдут.

Для пущей уверенности убрал сброс ResetEvent и установил флаг bManualReset=False в CreateEvent, создающем handle ResourceFree.


>atruhin
> Почитай Рихтера, все зависит от задачи: критические секции,
>  Event, Semaphore, для всего есть применение.

Ясно. Спасибо.


atruhin   (2006-08-31 06:45:00) [27]

> Возникает мысль, что все потоки одновременно выйдут из WaitForSingleObject

Не бойся не выйдут.

> то каким образом лучше сделать такое разделение общего ресурса

Почитай Рихтера, все зависит от задачи: критические секции, Event, Semaphore, для всего есть применение.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо