Есть ли какая-либо причина, чтобы открыть файл с общим доступом для записи? - PullRequest
4 голосов
/ 06 июня 2009

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

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

Ответы [ 3 ]

2 голосов
/ 06 июня 2009

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

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

В Windows вы можете использовать функцию LockFile () .
В Linux / Unix вы можете использовать fcntl () или flock ()

1 голос
/ 06 июня 2009

Сокеты на уровне ниже, чем File I / O.

Скажем, сервер прослушивает некоторый локальный порт 1999 и ретранслирует входящие сообщения всем подписавшимся клиентам через сервисный порт 3128.

Сервер может читать с нескольких локальных клиентов и ретранслировать на несколько удаленных клиентов. Если бы сервер был демоном аутентификации, несколько локальных приложений могли бы попытаться пройти аутентификацию через один и тот же сервер (службу). Удаленные клиенты могут быть уведомлены о том, что user-x теперь аутентифицирован, потому что он / она успешно вошел в систему на одном из приложений, использующих общий сервер аутентификации.

Я не знаю, о чем говорю. Я рискну догадаться.

1 голос
/ 06 июня 2009

Я рискну догадаться ... одна вещь, для которой это может быть использовано, для параллельных вычислений. Допустим, у вас есть два потока, выполняющих вычисления с высокой степенью параллелизации, и вам нужно, чтобы данные были записаны в один файл. Вы также можете заранее определить размер, необходимый для хранения выходных данных каждого потока (скажем, 50 МБ).

Итак, выделите файл размером 100 МБ, начните запись потока 1 со смещением 0, а поток 2 начните с 50 МБ. Когда потоки завершатся, у вас будет один составной файл (в противном случае, используя отдельные файлы, вам нужно будет добавить результат из потока № 2 в поток № 1).

ASCII Art Попытка

 ==============================  
|      50MB    |     50MB      |   [100 MB Total FileSize]
|              |               |  
 ==============================  
^               ^
|               |
Thread 1        Thread 2

Все это говорит, я никогда не делал этого. Это может даже не работать! Можно предположить, что вы просто делитесь дескриптором файла / потоком между потоками, используя какой-то другой механизм синхронизации, но тогда вам также придется сбросить смещение для каждого потока. Возможно, один или другой более эффективен.

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

В любом случае, мне также любопытен сценарий "реальной жизни", в котором был использован общий доступ для записи, и я буду ждать дополнительных ответов!

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