Параллельная запись в файл - PullRequest
8 голосов
/ 21 июля 2009

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

Например, если два разных процесса пишут в один и тот же момент в файл, это может привести к проблемам. Самое простое решение (не очень быстрое и не очень элегантное) - заблокировать файл при начале процесса (создать файл .lock или аналогичный) и освободить его (удалить блокировку), пока запись завершена.

В начале записи я бы проверил, существует ли файл .lock, и отложил бы запись до выпуска файла.

Каков рекомендуемый шаблон для такой ситуации?

Спасибо

EDIT Я имею в виду процессы, например разные программы от разных клиентов, разных пользователей и т. Д., А не потоки в одной программе

Ответы [ 6 ]

2 голосов
/ 21 июля 2009

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

2 голосов
/ 21 июля 2009

Рассмотрите возможность использования простой базы данных. Вы получите всю эту встроенную безопасность относительно легко.

1 голос
/ 21 июля 2009

Я бы посмотрел на что-то вроде Command Pattern для этого. Параллельная запись была бы кошмаром для целостности данных.

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

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

1 голос
/ 21 июля 2009

Я предлагаю использовать ReaderWriterLock. Он предназначен для нескольких читателей, но гарантирует, что только один писатель может записывать данные одновременно MSDN .

0 голосов
/ 21 июля 2009

Я бы также рекомендовал вам найти примеры наличия нескольких читателей, и только один писатель в критическом разделе представляет собой небольшую статью с хорошим решением http://arxiv.org/PS_cache/cs/pdf/0303/0303005v1.pdf

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

0 голосов
/ 21 июля 2009

Вы можете попробовать заблокировать тоже. Это просто - «блокировка гарантирует, что один поток не войдет в критический раздел, в то время как другой поток находится в критическом разделе кода. Если другой поток попытается ввести заблокированный код, он будет ждать (блокировать), пока объект не будет освобожден».

http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.71%29.aspx

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