Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

общие ресурсы   Найти похожие ветки 

 
niKo   (2007-12-17 15:55) [0]

подскажите пожалуста, каким образом предупредить одновременный доступ к одному и тому же ресурсу, нескольких запущенных копий одной и той же проги
для наглядности: запущенно до 5-ти копий проги, и все хотят одновременно писать или читать в один и тот же текстовый файл
спасиба


 
clickmaker ©   (2007-12-17 16:00) [1]

кто первый встал, того и тапки, что-ли?


 
Джо ©   (2007-12-17 16:01) [2]

> [0] niKo   (17.12.07 15:55)
> подскажите пожалуста, каким образом предупредить одновременный
> доступ к одному и тому же ресурсу, нескольких запущенных
> копий одной и той же проги
> для наглядности: запущенно до 5-ти копий проги, и все хотят
> одновременно писать или читать в один и тот же текстовый
> файл
> спасиба

Открывать файл эксклюзивно?


 
niKo   (2007-12-17 16:02) [3]


> кто первый встал, того и тапки, что-ли?

да что-то в этом роде, а дальше тапки по очереди! :)


 
Kolan ©   (2007-12-17 16:03) [4]

Сервер БД?


 
Юрий Зотов ©   (2007-12-17 16:06) [5]

Семафор?


 
DiamondShark ©   (2007-12-17 16:07) [6]

А какие ресурсы-то?

Для файлов параметр dwShareMode в CreateFile передавать равным 0.

Для других типов ресурсов подход будет другой.


 
ProgRAMmer Dimonych ©   (2007-12-17 16:07) [7]

> niKo   (17.12.07 15:55)  
> подскажите пожалуста, каким образом предупредить одновременный
> доступ к одному и тому же ресурсу

Жёлтую карточку этому доступу :) Кстати, знаки препинания иногда очень сильно упрощают решение задачи :)

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

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

В любом случае единственный вариант, который отсечёт все программы (не только Вашу), - это предложенный Джо ©   (17.12.07 16:01) [2].

Кстати, Вы часом не прогу для чата по локальной сети пишете?


 
niKo   (2007-12-17 16:41) [8]


> Пишем программу, которая единственная будет обращаться к
> файлу, типа программа-сервер

вариант очень хороший, но не выполнимо


> Кстати, Вы часом не прогу для чата по локальной сети пишете?

в таком случае использовал бы вариант первый


> Юрий Зотов ©   (17.12.07 16:06) [5]
>
> Семафор?

можна немного теории по использованию
я всегда при работе с потоками, но в одном приложении использовал свои флаги для управления доступом и работой потоков
интерисует только одно в принцыпе как выставить СЕМАФОР


 
Юрий Зотов ©   (2007-12-17 16:52) [9]

> niKo   (17.12.07 16:41) [8]

http://msdn2.microsoft.com/en-us/library/ms685129.aspx


 
Kolan ©   (2007-12-17 16:53) [10]

> в принцыпе как выставить СЕМАФОР

MSDN  в помошь &#133


 
niKo   (2007-12-17 17:07) [11]


> Юрий Зотов ©   (17.12.07 16:52) [9]
>
> > niKo   (17.12.07 16:41) [8]
>
> http://msdn2.microsoft.com/en-us/library/ms685129.aspx

спасиба!
буду разбираться!


 
niKo   (2007-12-17 17:40) [12]

вроде бы немного разобрался, подскажите если чего неправильно или как лучше сделать
 
 Semaphore := CreateSemaphore(NIL,1,1,"semaphor");
 WaitForSingleObject(Semaphore, INFINITE);

 //доступ к общим ресурсам

 ReleaseSemaphore(Semaphore, 1, NIL);
 CloseHandle(Semaphore);


 
Leonid Troyanovsky ©   (2007-12-17 17:44) [13]


> niKo   (17.12.07 17:40) [12]

> или как лучше сделать

[2]

--
Regards, LVT.


 
niKo   (2007-12-17 18:25) [14]


> Джо ©   (17.12.07 16:01) [2]
> Открывать файл эксклюзивно?

нужно просто организовать задержку(очередь) пока другое приложение изменяет файл и сразу же после освобождения, получить управление для следующего и т.д. если есть очередь!

код [12] в самом простом варианте подойдет или нет? или ето вообще не код :)


 
ProgRAMmer Dimonych ©   (2007-12-17 20:05) [15]

> niKo   (17.12.07 16:41) [8]
> > Пишем программу, которая единственная будет обращаться к
> > файлу, типа программа-сервер
> вариант очень хороший, но не выполнимо

Что и требовалось ожидать. :)

> > Кстати, Вы часом не прогу для чата по локальной сети пишете?
> в таком случае использовал бы вариант первый

Странно. Я бы в таком случае вообще файлов не использовал :)

=====

Ещё... Про эти Semaphore... Они во всех виндах поддерживаются?


 
Loginov Dmitry ©   (2007-12-17 21:37) [16]

> подскажите пожалуста, каким образом предупредить одновременный
> доступ к одному и тому же ресурсу, нескольких запущенных
> копий одной и той же проги
> для наглядности: запущенно до 5-ти копий проги, и все хотят
> одновременно писать или читать в один и тот же текстовый
> файл
> спасиба


Одновременно писать в один и тот же файл не получится (лучше этого не делать!), а одновременно читать - сколько угодно. Для записи открывать файл следует с атрибутом fmShareDenyWrite, для чтения - с fmShareDenyNone. Запись (а желательно также и чтение) следует защищать объектом синхронизации. Надежнее всего - с помощью мьютекса. Второй вариант - защитить запись в файл с помощью мьютекса, а чтение - с помощью семафора (чтобы ограничить количество клиентов, пытающихся одновременно прочитать файл). Но в последнем случае мы не можем определить размер файла (вернее не может полагаться, что результать функции GetFileSize будет актуален для следующей строки), и данные в файле могут измениться в любой момент времени. Таким образом: хочешь надежности - используй один мьютекс на запись в файл и на чтение. Хочешь производительности - защищай запись с файл мьютексом, а чтение - семафором.

 Думаю, можно и для записи и для чтения открывать файл с fmShareDenyNone, но вот запись в файл защищать семафором или мьютексом (но лучше в данном случае делать это с помьщью мьютекса).
Если нужно, чтобы это все работало в достаточной мере надежно, то следует одним объектом синхронизации защитить и запись и чтение, и при записи открывать файл с fmShareDenyWrite.


 
Loginov Dmitry ©   (2007-12-17 21:38) [17]

Последний абзац удалить забыл ((



Страницы: 1 вся ветка

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
15-1197708759
homm
2007-12-15 11:52
2008.01.20
Помогие устранит пробел в образовании.


15-1197639810
Fran
2007-12-14 16:43
2008.01.20
Дата прописью на калмыцком языке


15-1197466264
Kerk
2007-12-12 16:31
2008.01.20
Есть ли тут счастливые обладатели робопылесосов типа RV-2/RV-10


2-1197906138
andreil
2007-12-17 18:42
2008.01.20
namespace. Из С++ на Delphi


2-1197669910
Washington
2007-12-15 01:05
2008.01.20
Мерцание при прорисовке