Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Сентябрь 08, 2021, 21:06



Название: Чтение и запись в файл в разных потоках
Отправлено: demaker от Сентябрь 08, 2021, 21:06
Всем доброго времени суток!
Встал вопрос чтения и записи в разных потоках.
Ответ кажется очевидным.
Берем файл мьючим его и читаем в одном потоке,
а в другом пишем.

Но это кажется как-то не очень хорошей идей.
Может есть какой-нибудь варинт асинхронного чтения и записи?


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: Igors от Сентябрь 09, 2021, 06:41
Но это кажется как-то не очень хорошей идей.
А почему?
Может есть какой-нибудь варинт асинхронного чтения и записи?
Не вижу откуда им взяться. Ну если неск "читателей", то ReadWriteLock - но здесь и это не проходит т.к. каждому нужна своя позиция в файле


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: demaker от Сентябрь 09, 2021, 07:37
Но это кажется как-то не очень хорошей идей.
А почему?
Может есть какой-нибудь варинт асинхронного чтения и записи?
Не вижу откуда им взяться. Ну если неск "читателей", то ReadWriteLock - но здесь и это не проходит т.к. каждому нужна своя позиция в файле

Читаем из файла блоки информации определенного размера. Пишем естественно только в конец файла.

Поток на чтение
Код:

mutex_file.lock() ;

file. seek(pos) ;
file. read(but, size_block) ;

mutex_file.unlock() ;



Код:

mutex_file.lock() ;

file. seek(end_file) ;
file.write(buf, size_buf);

mutex_file.unlock() ;


 Стоит ли открывать и закрывать файл в потоках?  


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: Igors от Сентябрь 09, 2021, 08:50
Пишем естественно только в конец файла.
Это проще но не так уж естественно

Стоит ли открывать и закрывать файл в потоках?  
Ни в коем случае. Файл должен быть открыт один раз по чтению-записи.


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: Fregloin от Сентябрь 15, 2021, 13:53
Можно задействовать файловые потоки. Не уверен, что можно натравить два потока на один файл..


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: Vidos от Октябрь 26, 2021, 19:14
Сдаётся мне, что вы всё усложняете.
У файла, в один момент, может быть только одна позиция чтения/записи. Никак не получится одновременно читать кусок данных от куда-то с одной позиции и писать данные в другую позицию. По этому, это однозначно глухая блокировка файла в момент чтения/записи.
По этому задача делится на две части: фоновая работа с данными, после того как данные обработаны (подготовлены), запись в файл в файл с его блокировкой.


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: Old от Октябрь 26, 2021, 19:18
У файла, в один момент, может быть только одна позиция чтения/записи.
Да ну перестаньте, одна. :)
Попробуйте сами, открыть один файл из разных потоков и читать по случайным смещениям.
Или в один поток, но запустите несколько процессов, которые будут читать один файл.


Название: Re: Чтение и запись в файл в разных потоках
Отправлено: Vidos от Октябрь 26, 2021, 20:28
У файла, в один момент, может быть только одна позиция чтения/записи.
Да ну перестаньте, одна. :)
Попробуйте сами, открыть один файл из разных потоков и читать по случайным смещениям.
Или в один поток, но запустите несколько процессов, которые будут читать один файл.

Ну, если так пересмотреть задачу, то я с вами полностью согласен.  :)
Параллельное чтение из одного файла разными процессами вполне нормально. Но я исходил из текущей задачи - несколько потоков, чтение-запись, один объект файла. А тут уже другие подходы требуется.  ;)