Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.064 c
2-1267530370
Fr
2010-03-02 14:46
2010.08.27
компоненты в run-time


15-1264758958
Baks
2010-01-29 12:55
2010.08.27
Компонент для работы с FTP


2-1268475991
Fr
2010-03-13 13:26
2010.08.27
Сохранение TChart


2-1270461234
ПарамПамПам
2010-04-05 13:53
2010.08.27
TClass


15-1265588356
Германн
2010-02-08 03:19
2010.08.27
Вопрос для работников частных компаний.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский