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

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

Правильная синхронизация [D7, WinXP]


Страницы:   1 2

SamProf ©   (2006-08-08 13:37:00) 

Мастера, прошу помоч с такой проблемой:
Есть файл этак 70-150 метров
Есть много приложений(потоков)-читателей (они этот файл читают, обрабатывают и выдают резулбтат юзеру)
Есть одно приложение - писатель (он полностью переписывает файл)
Проблема: Сами по себе читатели могут в одновременно читать этот файл
Как тока писатель собрался писать в файл - он должен дождатся завершения уже начавших чтение потоков и не пускать вновь созданых читателей, потом писать в файл (читатели ждут), как тока писатель закончит - разрешить чтение всем читателям...

Как это сделать по уму?


Сергей М.   (2006-08-08 14:44:00) [21]


> DiamondShark ©   (08.08.06 14:27) [6]


> При достаточно резвой активности читателей писатель может
> дожидаться освобождения файла до второго пришествия


Равно, заметь, как и сигнала объекта синхронизации - до того же самого пришествия)


> Если совсем по-уму


Если совсем уж по уму, то арбитражем доступа к ресурсу (со стороны и писателей и читателей) должен заведовать специально реализованный сервис.


DiamondShark   (2006-08-08 14:27:00) [22]

Нехороший псевдокод.
Race condition типичнейший. ;)
При достаточно резвой активности читателей писатель может дожидаться освобождения файла до второго пришествия.

Если совсем по-уму, то читателей надо вообще изолировать от файла.
Пусть пользуются прикладным интерфейсом писателя.


Сергей М.   (2006-08-08 14:13:00) [23]


> SamProf ©   (08.08.06 13:37)


"Писатель" может поступать так (псевдокод):

TmpFile = CopyFile(SharedFile); //делается врем.копия совместно используемого файла
Prepare(TmpFile); //содержимое копии обновляется
while not MoveFile(TmpFile -> SharedFile) do sleep; //как только "читатели" освободят ориг.файл, на его место записывается обновленный врем.файл


Leonid Troyanovsky   (2006-08-08 14:00:00) [24]


> MBo ©   (08.08.06 13:42) [1]

> TMultiReadExclusiveWriteSynchronizer


Он не IPC. Лучше, тут что-то типарихтеровского  SWMRG

http://www.codeguru.com/forum/showthread.php?s=&threadid=119395

http://groups.google.com/group/fido7.ru.delphi.info/msg/2cdccacbf3938fe2

--
Regards, LVT.


SamProf   (2006-08-08 13:55:00) [25]

>MBo ©   (08.08.06 13:42) [1]
>TMultiReadExclusiveWriteSynchronizer

А он работает в рамках одного приложения?


clickmaker   (2006-08-08 13:44:00) [26]


> Как тока писатель собрался писать в файл - он должен дождатся
> завершения уже начавших чтение потоков

читатель создает Mutex на время чтения, писатель WaitForMultipleObjects их
потом монопольно открывает файл (0 в sharemode ф-ии CreateFile), либо сам создает mutex, а клиенты WaitForSingleObject его
Насчет не пускать новых - можно семафор заюзать


MBo   (2006-08-08 13:42:00) [27]

TMultiReadExclusiveWriteSynchronizer


Страницы:   1 2

Наверх

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