Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Многопоточный доступ к файлу  (Прочитано 980 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Ashbe

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
  • Дружба хороша при жизни.
    • Просмотр профиля
Многопоточный доступ к файлу
« : 11 Января 2016, 10:45:52 »
Нужно сделать в проге одновременный доступ к файлу нескольких потоков (создаются динамически). То есть главный поток открывает файл, а остальные потоки с ним должны работать. Эти потоки производят только чтение из файла (подчёркиваю!).
В связи с этим вопрос, как у линукс-новичка: на что тут нужно обратить внимание, то бишь какие тут могут быть "подводные камни" и т.п.?
Спасибо.

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 754
    • Просмотр профиля
Re: Многопоточный доступ к файлу
« Ответ #1 : 11 Января 2016, 11:55:27 »
Вот тут дается хорошее объяснение, imho http://stackoverflow.com/a/10677087/2814617

Т.е. лучше иметь один поток для чтения и стараться это делать последовательными пачками. А если файл не очень большой, то вообще имеет смысл загрузить его в память полностью. Ну или в этом потоке сделать кэш определенного размера.

shura1

  • Гость
Re: Многопоточный доступ к файлу
« Ответ #2 : 11 Января 2016, 12:06:30 »
Открытый файловый дескриптор и все связанные с ним структуры данных - один для всех потоков. Прочитал байт один поток, и как-бы все прочитали - сдвинулись на байт - следующее чтение у каждого из потоков будет со следующего байта.

Я навскидку даже знаю весьма специфический случай,когда это может быть полезно. Но в 99.9 процентов это ерунда же. Так что каждый поток или должен ставить лок и читать весь файл целиком, или придумывать какую-то хитрую систему координации. Может уже кто и придумал

Короче. Пользуйтесь процессами - хоть тысячи на Линуксе запускайте - это дешево достаточно.

PS Прогуглил маленько - лок не надо ставить на Линуксе, когда поток читает файл целиком - ядро заботится о безопасности. Но все остальное, как я выше написал.

Пользователь решил продолжить мысль 11 Января 2016, 12:14:59:
PSS - Lock то все-равно ставить надо. Это ж каждый процесс должен сначала seek 0, а только потом read - a это уже не атомарно. Короче головняк.

Запускайте новый процесс и открывайте заново.
« Последнее редактирование: 11 Января 2016, 12:14:59 от Jshura »

Оффлайн Ashbe

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
  • Дружба хороша при жизни.
    • Просмотр профиля
Re: Многопоточный доступ к файлу
« Ответ #3 : 11 Января 2016, 12:52:18 »
Мда... спасибо. Пожалуй, на данном этапе подойдёт вариант с загрузкой всего файла  в память. Процессы плодить и с этим разбираться уже времени нет.

 

Страница сгенерирована за 0.036 секунд. Запросов: 25.