![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильная синхронизация [D7, WinXP]
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