![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись/чтение в файл из разных потоков
ford © (2010-04-09 12:50:00)Доброго времени суток!
Есть такая вот задачка:
существует один файл методы чтения и записи в него инкапсулированы в собственном классе.
В программе надо запустить несколько потоков(нитей) которые будут читать и писать в этот файл используя объект инкапсулирующий методы чтения и записи.
Сколько будет нитей которые хотят получить информацию из файла или записать в него, заранее не известно.
Возникает вопрос синхронизации этого дела. т.е. необходимо чтобы нить из которой идет запрос на получение данных, определяла занят ли этот объект другими нитями, и если занят то ждала пока объект не освободится.
почитал статью http://www.tisbi.ru/resource/lib/Eltext/DelphiProf/Glava29/GL29.htm
там есть методы синхронизации но дано три варианта, и вот какой выбрать в своей реализации....
подскажите какой вариант лучше, если кто сталкивался с подобным :)
nana (2010-05-22 16:43:00) [1]Удалено модератором
ford (2010-04-09 16:49:00) [2]
> вход/выход в секцию это и есть TCritilalSection.Enter/Leave
незнал что это так реализовано в дельфи
Медвежонок Пятачок (2010-04-09 16:44:00) [3]что как же?
вход/выход в секцию это и есть TCritilalSection.Enter/Leave
ford (2010-04-09 16:26:00) [4]
> Медвежонок Пятачок © (09.04.10 16:23) [15]
>
> ну тогда внутри обоих методов должно быть
>
> try
> вход в секцию
> <полезный код>
> finally
> выход из секции
> end;
т.е. try ... finaly .. end; это секция которая будет выполнятся и другие потоки ничего не смогут пока она не выполниться?
а как же TCriticalSection ?
Медвежонок Пятачок (2010-04-09 16:23:00) [5]ну тогда внутри обоих методов должно быть
try
вход в секцию
<полезный код>
finally
выход из секции
end;
ford (2010-04-09 16:18:00) [6]так как будет выполнятся код из моего сообщения
> ford © (09.04.10 15:58) [11]
??
ford (2010-04-09 16:17:00) [7]
> Медвежонок Пятачок © (09.04.10 16:11) [12]
>
> а ты как хотел?
> все пишут и все читают одновременно?
нет естественно, тем более я такого и не спрашивал :)
Медвежонок Пятачок (2010-04-09 16:11:00) [8]а ты как хотел?
все пишут и все читают одновременно?
ford (2010-04-09 15:58:00) [9]к стати не очень могу себе представить что произойдет в данном случае
например есть такие методы у класса:
метод1
оператор1
оператор2
оператор3
...
конец метода1
метод2
оператор1
оператор2
оператор3
...
конец метода2
есть две нити одна запускает метод1, и он начинает выполнятся
например происходит выполнение "оператор2"
в это же время другая нить запрашивает выполнение метод2 у того же объекта
как будет происходить выполнение этих методов?
выполнение метода1 для первой нити отложется на оператор2 и начнется выполнение метода2 и когда он завершиться . продолжиться выполнение метода1 с оператор3 , так?
код то собственно единственный у этих методов, он не описан в методах самой нити.
и если я заключу в критическую секцию оба этих метода
то что опять таки будет? первая нить продолжит выполняться и вторая будет ждать пока не закончитсся критическая секция выполняемая из нити1?
:(
совсем запутался
ford (2010-04-09 15:50:00) [10]
> Перед любым телодвижением в сторону файла
> И сразу после окончания работы с ним.
помимо записи или чтения из файла
в классе организованны методы которые выдают результат на основе содержимого файла.
т.е. если я установлю критические секции на чтение и на запись
не получиться в таком случае "тупик" когда одна нить запросит у объекта метод который читает из файла а другая нить одновременно запросит запись в файл?
Anatoly Podgoretsky (2010-04-09 15:38:00) [11]> Sha (09.04.2010 14:39:08) [8]
Ну тут еще хуже, тут нужен семафор, критическая секция в данном случае не помощник
Sha (2010-04-09 14:39:00) [12]Ну и чтение тоже, если есть шанс прочитать несогласованные или временные данные.
Sha (2010-04-09 14:36:00) [13]ford © (09.04.10 13:47) [4]
Любая последовательность операций с файлом, переводящая его в новое
непротиворечивое состояние, должна выполняться в критической секции.
Медвежонок Пятачок (2010-04-09 14:05:00) [14]а где именно
Перед любым телодвижением в сторону файла
И сразу после окончания работы с ним.
ford (2010-04-09 13:52:00) [15]
> сказали же, используй критическую секцию
>
а почему бы не использовать события
т.е. когда объект выполнил операцию чтения/записи он формирует событие ?
потоки же не одновременно обрабатывают события, а в порядке очереди
т.е. поток который первый в очереди увидел его убрал из очереди событий
выполнил свое "грязное дело" вызвав методы класса записи или чтения
после выполнения которых они сами же и инициируют снова это событие. Или сам поток возвращает это событие в очередь.
можно как то подробнее описать почему вы предлагаете именно критическую секцию
:)
ford (2010-04-09 13:47:00) [16]
> Медвежонок Пятачок © (09.04.10 13:35) [3]
>
> сказали же, используй критическую секцию
а где именно в реализации методов класса который работает с файлом
или в методах Execute потоков?
Медвежонок Пятачок (2010-04-09 13:35:00) [17]сказали же, используй критическую секцию
ford (2010-04-09 13:26:00) [18]параметром 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:11:00) [19]Достаточно использовать критическую секцию, либо просто использовать метод Synchronize.