c ++ одновременный доступ к fstream - PullRequest
4 голосов
/ 28 октября 2010

Что произойдет, если к файлам обращаются одновременно из разных процессов / потоков?Я понимаю, что нет стандартного способа блокировки файла, есть только специальные функции.

В моем случае файлы читаются часто и пишутся редко.Теперь, если A, откройте файл для чтения (ifstream) и начните чтение фрагментов.И B открывает тот же файл для записи (ofstream) и начинает запись.Что случится?Есть ли определенное поведение?

edit Моя цель - одновременное чтение, запись во многие файлы.Но доступ для записи не будет происходить очень часто.Я был бы доволен, если бы fstream гарантировал, что содержимое файла не перепуталось.

Например: Процесс 1 и 2 записывают в файл A. Если они записывают одновременно, мне все равно, версия 1 или2 записывается на диск, если это согласованная версия файла.

Если процесс читает файл, а другой записывает в него одновременно, я хочу, чтобы процесс чтения получил «старый»"версия файла.

Если fstreams не справится с этим, я буду использовать базу данных.

Ответы [ 2 ]

7 голосов
/ 29 октября 2010

Конечно, не существует портативного способа эффективного обмена файлами (с одновременным доступом) с использованием C ++.

  1. Вы можете обмениваться файлами, используя файл блокировки.Перед открытием "foo.dat" попробуйте создать файл "foo.lock".Продолжайте, пока не добьетесь успеха.После доступа удалите foo.lock.Это позволяет последовательный доступ, но не одновременный доступ.

  2. Вы можете использовать блокировку на уровне байтов в зависимости от платформы.В Windows есть LockFileEx ().POSIX имеет fcntl и flock.Если вам нужны мультиплатформы, вам потребуются отдельные реализации.Вы можете инкапсулировать их в класс и использовать #if для обработки специфичных для платформы битов.Это самый эффективный (самый быстрый) из всех, но он включает в себя очень сложное программирование и подвержен ошибкам.

  3. Вы можете использовать СУБД.

СУБД будет намного проще, но она привязывает вас к внешнему продукту, что может быть или не быть проблемой.Байтовая блокировка намного быстрее, чем что-либо еще, но значительно увеличит затраты на разработку и обслуживание.

1 голос
/ 28 октября 2010

Какова ваша цель?Вы пытаетесь предотвратить одновременные операции чтения / записи в файлы или хотите реализовать какую-либо форму IPC через файлы?

В любом случае, посмотрите на промежуточный процесс boost, он дает вам возможность использовать блокировки файлов (идругие интересные вещи для IPC) И у этого есть дополнительное преимущество того, чтобы быть портативным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...