Форум: "Начинающим";
Текущий архив: 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