Безопасно ли использовать TellP для блокировки файлов? - PullRequest
2 голосов
/ 12 января 2011

Общая стратегия для форсированной блокировки файлов (разделяемые и ограниченные по объему file_locks) и блокировки файлов в целом, я думаю, такова:

  1. open
  2. lock
  3. работать с содержимым файла
  4. разблокировать
  5. закрыть файл

Однако я буду открывать файл для добавления и хочу вызвать Tellp, чтобы увидетьгде я.Безопасно ли это делать в приведенном выше сценарии?Разве указатель файла не будет установлен, как только файл будет открыт до блокировки и, следовательно, потенциально не защищен?Если так, есть ли стандартная идиома, чтобы обойти это?

Ответы [ 2 ]

1 голос
/ 13 января 2011

Это может зависеть от среды, но на большинстве платформ:

Когда файл открывается для добавления, указатель файла корректируется непосредственно перед каждой записью. Таким образом, если вы используете tellp перед блокировкой файла, он может не сказать вам, куда пойдут ваши недавно добавленные байты, но у вас не должно быть двух процессов, использующих блокировку, которые все равно добавляют тот же диапазон байтов.

0 голосов
/ 13 января 2011

Я рекомендую хорошую документацию для повышения: http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock

В которой вы можете прочитать:

  • блокировки файлов не являются блокировками операционной системы, даже если операционная система поддерживает ее (например, Windowsда, как в Unix, как правило, нет), поэтому, если вы заблокируете файл, любой сможет прочитать / записать / удалить его, если другой процесс не использует тот же механизм блокировки файлов.Таким образом, думайте об этом больше как о мьютексах между процессами, а не о реальных блокировках файлов.
  • блокировки файлов предназначены для межпроцессной синхронизации, они не синхронизируют несколько потоков внутри процесса
  • , не забывайте о сбросе), так что вам не нужно беспокоиться о буферизации

О, это просто ужасно ... Я хотел помочь, я написал пример кода, попробуйте его и ... начиная с файла 1_44блокировка для win32 нарушена, очистка не работает для заблокированного файла.

Извините, я не виноват.

Теоретически это помогает: если вы открываете файл для добавления, это означает автоматическоестремясь закончить перед каждой операцией записи.Это не останавливает вас от ручного поиска конца в любое время, даже если вы не пишете.Однако опыт (см. Выше) говорит: держись подальше от разбитых вещей.

...