Недавно я наткнулся на немного плохо протестированного устаревшего кода для записи данных, распределенных между несколькими процессами (которые являются частью параллельных вычислений на основе MPI) в один и тот же файл. Это действительно гарантированно работает?
Это выглядит так:
Все процессы открывают один и тот же файл для записи.
Каждый процесс вызывает fseek
для поиска другого места в файле. Эта позиция может быть за концом файла.
Затем каждый процесс записывает блок данных в файл с помощью fwrite
. Места поиска
и размеры блоков таковы, что эти записи полностью разбивают
раздел файла -- без пробелов, без перекрытий.
Гарантировано ли, что это сработает, или иногда это приведет к ужасным сбоям? Нет блокировки для сериализации записей, и на самом деле они, скорее всего, будут начинаться с точки синхронизации. С другой стороны, мы можем гарантировать, что они пишут в разные позиции файла, в отличие от других вопросов, в которых были проблемы с попыткой записи в «конец файла» из нескольких процессов.
Мне приходит в голову, что процессы могут быть на разных машинах, которые монтируют файл через NFS, что, я подозреваю, вероятно, отвечает на мой вопрос — но будет ли это работать, если файл локальный?