LINUX.ORG.RU

Одновременная запись в файл (аналог sharedfilestream)


0

0

Привет, all!

Такой вопрос: есть ли какие-нить механизмы (читай - ограничения), позволяющие одновременно писать в файл (ну, файл-то один, но запись идет по разным offset`ам в несколько потоков одновременно)? В оффтопике там есть флаги shared, а в линуксе с этим как?

з.ы. пытаюсь написать аналог класса sharedfilestream из revconnect... може, кто тыкнет пальцем в нужном направлении? ,)

ограничения? если через сисколы - то пиши с разных файловых дескрипторов; если mmap - то вообще никаких ограничений но может потребовать мьютекса или блокировку на пересекающиеся области.

естественно я ожидаю что под потоками ты понимаеш pthread. Иначе никаких ограничений на сисколы, но mmap надо делать как MAP_SHARED

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

> естественно я ожидаю что под потоками ты понимаеш pthread. Иначе никаких ограничений на сисколы, но mmap надо делать как MAP_SHARED

не совсем то. если файлик большой (ну, скажем, гораздо больше ОЗУ), то будут тормоза, я прально понимаю? у меня немного другое - у меня есть n потоков (stream, но в основе - да, pthread), которым надо одновременно писать в один файл. каждый поток пишет в свой сегмент (сегменты не перекрываются). и мне бы желательно не отображать файлик, а просто сбрасывать в файл сразу, без дополнительных телодвижений.

akaslon
() автор топика
Ответ на: комментарий от fghj

> man pwrite

а как оно насчет потоков? в смысле если несколько потоков одновременно pwite в один файл с разными оффсетами (сегменты не пересекаются)?

akaslon
() автор топика
Ответ на: комментарий от akaslon

> а как оно насчет потоков? в смысле если несколько потоков одновременно pwite в один файл с разными оффсетами (сегменты не пересекаются)?

думаю, что нормально, хотя POSIX на эту тему отнекивается.

http://www.opengroup.org/onlinepubs/009695399/functions/write.html

--- cut ---
This volume of IEEE Std 1003.1-2001 does not specify behavior of concurrent writes to a file from multiple processes. Applications should use some form of concurrency control.
--- cut ---

// wbr

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

>если файлик большой (ну, скажем, гораздо больше ОЗУ), то будут тормоза, я прально понимаю?

во первых никто тебя не заставляет мепить весь файл. во вторых при меппинге файл в память *не копируется*. тоесть в конечном счёте обычный memcpy будет как-бы неявный write()

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

> который возможно имеет смысл размножить или прикрыть мьютексом.

именно размножен и прикрыт мьютексом ,) именно так.

akaslon
() автор топика
Ответ на: комментарий от akaslon

> именно размножен и прикрыт мьютексом ,) именно так.

hm... он таки или размножен или прикрыт мьютексом? бо желание сделать и то и другое одновременно вызывает некоторые сомнения :)

// wbr

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

старею...

прикрыт мьютексом, конечно.

akaslon
() автор топика
Ответ на: комментарий от akaslon

> как оно насчет потоков? в смысле если несколько потоков >одновременно pwite в один файл с разными оффсетами (сегменты не >пересекаются)?

Если речь идет о не слишком старом ядре linux,
то все будет работать нормально.

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

pwrite затем и задумывался, чтобы seek && write мютексами не оборачивать

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