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

Вниз

Запись/чтение в файл из разных потоков   Найти похожие ветки 

 
ford ©   (2010-04-09 12:50) [0]

Доброго времени суток!
Есть такая вот задачка:
существует один файл методы чтения и записи в него инкапсулированы в собственном классе.
В программе надо запустить несколько потоков(нитей) которые будут читать и писать в этот файл используя объект инкапсулирующий методы чтения и записи.
Сколько будет нитей которые хотят получить информацию из файла или записать в него, заранее не известно.

Возникает вопрос синхронизации этого дела. т.е. необходимо чтобы нить из которой идет запрос на получение данных, определяла занят ли этот объект другими нитями, и если занят то ждала пока объект не освободится.

почитал статью http://www.tisbi.ru/resource/lib/Eltext/DelphiProf/Glava29/GL29.htm
там есть методы синхронизации но дано три варианта, и вот какой выбрать в своей реализации....

подскажите какой вариант лучше, если кто сталкивался с подобным :)


 
Демо ©   (2010-04-09 13:11) [1]

Достаточно использовать критическую секцию, либо просто использовать метод Synchronize.


 
ford ©   (2010-04-09 13:26) [2]

параметром Synchronize выступает функция типа TThreadMethod
т.е. без парамтров...

несовсем понял как это реализовать.
есть класс
TExFile=class
  fSrc:TFileStream;
...
 procedure Write(Source:String);
 function Read:String;
...
end;

есть глобальная переменная, объект этого класса, которая создается после старта программы (например)
Var ex:TExFile;

далее допустим я создал три потока, два из которых будут писать и один который читать.
т.е. в методах Execute у них
примерно такое
...
ex.Write("thread1");
...

а у того который читает
примерно
var st:String;
...
st:=ex.read;
...

и как тут использовать synhronize?


 
Медвежонок Пятачок ©   (2010-04-09 13:35) [3]

сказали же, используй критическую секцию


 
ford ©   (2010-04-09 13:47) [4]


> Медвежонок Пятачок ©   (09.04.10 13:35) [3]
>
> сказали же, используй критическую секцию

а где именно в реализации методов класса который работает с файлом
или в методах Execute потоков?


 
ford ©   (2010-04-09 13:52) [5]


> сказали же, используй критическую секцию
>


а почему бы не использовать события
т.е. когда объект выполнил операцию чтения/записи он формирует событие ?

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

можно как то подробнее описать почему вы предлагаете именно критическую секцию
:)


 
Медвежонок Пятачок ©   (2010-04-09 14:05) [6]

а где именно

Перед любым телодвижением в сторону файла
И сразу после окончания работы с ним.


 
Sha ©   (2010-04-09 14:36) [7]

ford ©   (09.04.10 13:47) [4]

Любая последовательность операций с файлом, переводящая его в новое
непротиворечивое состояние, должна выполняться в критической секции.


 
Sha ©   (2010-04-09 14:39) [8]

Ну и чтение тоже, если есть шанс прочитать несогласованные или временные данные.


 
Anatoly Podgoretsky ©   (2010-04-09 15:38) [9]

> Sha  (09.04.2010 14:39:08)  [8]

Ну тут еще хуже, тут нужен семафор, критическая секция в данном случае не помощник


 
ford ©   (2010-04-09 15:50) [10]


> Перед любым телодвижением в сторону файла
> И сразу после окончания работы с ним.

помимо записи или чтения из файла
в классе организованны методы которые выдают результат на основе содержимого файла.
т.е. если я установлю критические секции на чтение и на запись
не получиться в таком случае "тупик" когда одна нить запросит у объекта метод который читает из файла а другая нить одновременно запросит запись в файл?


 
ford ©   (2010-04-09 15:58) [11]

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

метод1
оператор1
оператор2
оператор3
...
конец метода1

метод2
оператор1
оператор2
оператор3
...
конец метода2

есть две нити одна запускает метод1, и он начинает выполнятся
например происходит выполнение "оператор2"
в это же время другая нить запрашивает выполнение метод2 у того же объекта

как будет происходить выполнение этих методов?
выполнение метода1 для первой нити отложется на оператор2 и начнется выполнение метода2 и когда он завершиться . продолжиться выполнение метода1 с оператор3 , так?

код то собственно единственный у этих методов, он не описан в методах самой нити.
и если я заключу в критическую секцию оба этих метода
то что опять таки будет? первая нить продолжит выполняться и вторая будет ждать пока не закончитсся критическая секция выполняемая из нити1?

:(
совсем запутался


 
Медвежонок Пятачок ©   (2010-04-09 16:11) [12]

а ты как хотел?
все пишут и все читают одновременно?


 
ford ©   (2010-04-09 16:17) [13]


> Медвежонок Пятачок ©   (09.04.10 16:11) [12]
>
> а ты как хотел?
> все пишут и все читают одновременно?

нет естественно, тем более я такого и не спрашивал :)


 
ford ©   (2010-04-09 16:18) [14]

так как будет выполнятся код из моего сообщения

> ford ©   (09.04.10 15:58) [11]


??


 
Медвежонок Пятачок ©   (2010-04-09 16:23) [15]

ну тогда внутри обоих методов должно быть

try
вход в секцию
<полезный код>
finally
выход из секции
end;


 
ford ©   (2010-04-09 16:26) [16]


> Медвежонок Пятачок ©   (09.04.10 16:23) [15]
>
> ну тогда внутри обоих методов должно быть
>
> try
> вход в секцию
> <полезный код>
> finally
> выход из секции
> end;


т.е. try ... finaly .. end;  это секция которая будет выполнятся и другие потоки ничего не смогут пока она не выполниться?
а как же TCriticalSection ?


 
Медвежонок Пятачок ©   (2010-04-09 16:44) [17]

что как же?

вход/выход в секцию это и есть TCritilalSection.Enter/Leave


 
ford ©   (2010-04-09 16:49) [18]


> вход/выход в секцию это и есть TCritilalSection.Enter/Leave

незнал что это так реализовано в дельфи


 
nana   (2010-05-22 16:43) [19]

Удалено модератором



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

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

Наверх




Память: 0.51 MB
Время: 0.068 c
15-1268775005
Юрий
2010-03-17 00:30
2010.08.27
С днем рождения ! 17 марта 2010 среда


15-1274300990
Юрий
2010-05-20 00:29
2010.08.27
С днем рождения ! 20 мая 2010 четверг


3-1238738221
Cabyrc
2009-04-03 09:57
2010.08.27
ConnectionString для FoxPro


2-1275032909
12
2010-05-28 11:48
2010.08.27
Откуда то происходит beep, при закрытии формы. Не надо его.


2-1267276280
lewka
2010-02-27 16:11
2010.08.27
Работа с архиватором