Является ли tellp безопасным для использования с блокировкой файлов


Общая стратегия блокировки файлов boost (sharable и scoped file_locks) и блокировки файлов в целом, я думаю, такова:

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

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

2 2

2 ответа:

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

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

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

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

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

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

Извините, не мой ошибка.

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