![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
![]()
Скажите - могут ли, два или более потоков одновременно читать файл?
Как это протестировать не придумал, по этому задаю вопрос. Последний раз редактировалось SAMOUCHKA; 25.05.2017 в 13:34. Причина: создал тему не в том разделе |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Смотря как. А зачем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
![]()
на сервере хранится файл. по запросу клиентского приложения его нужно читать и отправлять данные клиенту.
Запрос на чтение файла может придти сразу от нескольких клиентов. Там будет класс, обертка над QTcpSocket. для каждого клиента будет создаватся экземпляр этого класса и работать в своем потоке |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Не должно быть проблем если в это же время не надо писать и т.п. файл. Просто открывать с соответствующим флагом про шаринг.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#5 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Мне тоже это в скором времени предстоит.
Читать могут. Вопрос только как. Что нам пишет справка по QT? http://doc.qt.io/qt-4.8/threads-reentrancy.html http://doc.qt.io/qt-4.8/threads-qobject.html В двух словах QT - обладает минимальной защитой от много-поточных приложений. Даже проще сказать её там нет. Если у вас у каждого потока разные объекты. То вы можете с ними работать безбоязненно. Если у вас общий объект для нескольких потоков то вы можете Вызывать его функции только у которых есть пометка thread-safe или то reentrant. Функции с пометкой thread-safe принимают данные на общие ресурсы через умные указатели. А функции reentrant могут принимать от каждого потока его данные. Что это значит? Это два пути. Первый путь. В каждом потоке порождать(инстацировать) свой объект. В каждым открываем файл и пусть ОС разгребает. ОС сама не может справиться, вы ей должны объяснить что это общий ресурс. В зависимости от ОС надо указать ReadOnly и/или Shared. Второй путь. Это общий объект внутри программы. Для этого потребуется сделать обёртку над QFile. Добавляем мьютекс и внутри каждой функции закрываем объект, а потом по выходу открывает. Как щеколда в туалете, ванной. Наверняка, кто-то уже готовое делал и надо просто поискать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Причем тут потоки? Автор не говорил ничего про работу с общими объектами в его программе.
Один и тот же QFile использовать в разных потоках конечно нельзя, да.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#7 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Alex11223 Автор в заголовке написал что речь про многопоточность.
И потом ещё уточнил что работать в потоке. Явно автор ведёт речь про исполняемые-поток, а не про потоки вввода/вывода. Во-вторых я рассмотрел оба случая. Путь первый это и есть когда у него разные объекты имеют доступ к одному общему ресурсу(файлу). Но насколько помню ReadOnly недостаточно и нужно ставит общий. Но чтото я в QT пока не найду как.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#8 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Судя по всему Shared не получится. Зато можно отобразить в память uchar* p = file.map(0, File.Size());
И передать указатель. И читать напрямую из памяти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Судя по всему в QT подход следующий. Файлы всегда открываются на совместное чтения и на запись. Ничего с ними делать не надо. А вот если вы хотите их заблокировать, то есть QLockFile. Хотя так ли это на самом деле надо проверить в виндоусе и линуксе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
![]()
А как практически протестировать? Видимо тут многое от ОС зависит.
Потоки - я имел ввиду многопоточную программу. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с файлами | maxwelln1 | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 15.10.2016 21:21 |
Лабораторная работа(очень простая) Структуры, работа с файлами | yurda | Фриланс | 2 | 11.06.2016 08:44 |
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами | Konlor | Общие вопросы C/C++ | 2 | 18.05.2014 12:37 |
работа с файлами | Ioane | Помощь студентам | 0 | 28.02.2012 16:52 |
Работа с файлами | prem1era | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 06.06.2010 19:28 |