LINUX.ORG.RU

C++ fopen shared file

 


0

3

Для работы с файлами использую fopen для открытия файла. Тут вдруг понадобилось одновременно открыть файл нескольким потокам для чтения.

Как открыть файл в таком режиме используя fopen? Или использовать что-то другое?

А чем не устроил std::ifstream?

Правда про него пишут

Data races Modifies the ifstream object. Concurrent access to the same stream object introduce data races.

А вобще я правильно понял, что тебе в каждом потоке надо открыть один и тот же файл и читать из него?

WRG ★★★★
()
Ответ на: комментарий от sitev_ru

Почитай man dup, может это то, что ты хочешь. А еще по идее можно открывать файл на чтение сколько угодно раз, т.е. внутри каждого потока отдельно.

WRG ★★★★
()

Делаешь глобальную переменную типа FILE *. И юзаешь её во всех потоках. В чём проблема?

DELIRIUM ☆☆☆☆☆
()

его можно в рамку просто полностью загрузить. И таким образом читать в куче потоков.

RevenantX ★★★★
()
Ответ на: комментарий от DELIRIUM

Делаешь глобальную переменную типа FILE *. И юзаешь её во всех потоках. В чём проблема?

  .-'---`-.
,'          `.
|             \
|              \
\           _  \
,\  _    ,'-,/-)\
( * \ \,' ,' ,'-)
 `._,)     -',-')
   \/         "/
    )        / /
   /       ,'-'
yoghurt ★★★★★
()
Ответ на: комментарий от RevenantX

его можно в рамку просто полностью загрузить.

Рамки может не хватить.

А вообще вот, говорят thread safe: http://stackoverflow.com/questions/17431813/c-read-and-thread-safety-linux

... или нет: http://stackoverflow.com/questions/22366776/is-reading-and-writing-to-the-sam...

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

А вот еще страничка мануала про flockfile() из GLIBC: http://man7.org/linux/man-pages/man3/flockfile.3.html

The stdio functions are thread-safe. This is achieved by assigning to each FILE object a lockcount and (if the lockcount is nonzero) an owning thread.

All this is invisible to the C-programmer, but there may be two reasons to wish for more detailed control. On the one hand, maybe a series of I/O actions by one thread belongs together, and should not be interrupted by the I/O of some other thread. On the other hand, maybe the locking overhead should be avoided for greater efficiency.

Блин, нужно теперь стандарт читать :(

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от Elyas

нет, блокировки не нужны. по теорверу вычислительная машина сама знает когда, куда и что записать

anonymous
()

а давайте напишем фреймворк для чтения файла несколькими потоками?

anonymous
()
Ответ на: комментарий от yoghurt

не такой уж и фейспалм. хард не может в многопоточность, в отличие от проца. к тому же, скорость рандомного доступа заметно ниже последовательного, поэтому, как только встанет вопрос о быстром чтении с большого файла к тому всё и сведётся.

next_time ★★★★★
()
Ответ на: комментарий от yoghurt

с одним курсором на всех мы в итоге и получаем нечто эквивалентное «Делаешь глобальную переменную типа FILE *. И юзаешь её во всех потоках.» только безопасное, зато криво оптимизированное.

next_time ★★★★★
()
Ответ на: комментарий от next_time

с одним курсором на всех мы в итоге и получаем нечто эквивалентное «Делаешь глобальную переменную типа FILE *.

Равное

только безопасное, зато криво оптимизированное.

Если каждый поток должен читать файл индивидуально, то это - антирешение, я вот к чему.

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.