API блокировки файлов, как правило, предназначены для межпроцессной блокировки. Если вы находитесь в одном процессе, все в Boost.Thread пакете , которое соответствует вашим потребностям, подойдет. Внешние процессы должны использоваться Boost.Interprocess . Возможно, вы захотите прочитать следующее предупреждение от Boost.Interprocess:
Caution: Synchronization limitations
Если вы планируете использовать блокировки файлов точно так же, как и именованные мьютексы, будьте осторожны, потому что переносимые блокировки файлов имеют ограничения синхронизации, главным образом потому, что разные реализации (POSIX, Windows) предлагают разные гарантии. Межпроцессные блокировки файлов имеют следующие ограничения:
- Не указано, если
file_lock
синхронизирует два потока из одного процесса.
- Не определено, может ли процесс использовать два объекта
file_lock
, указывающих на один и тот же файл.
Первое ограничение в основном исходит от POSIX, поскольку дескриптор файла является атрибутом для процесса, а не атрибутом для потока. Это означает, что если поток использует объект file_lock
для блокировки файла, другие потоки увидят файл как заблокированный. Механизм блокировки файлов Windows, с другой стороны, предлагает гарантии синхронизации потоков, поэтому поток, пытающийся заблокировать уже заблокированный файл, заблокируется.
Второе ограничение связано с тем, что в Windows состояние синхронизации блокировки файлов связано с одним дескриптором файла. Это означает, что если создаются два объекта file_lock, указывающие на один и тот же файл, синхронизация не гарантируется. В POSIX, когда два файловых дескриптора используются для блокировки файла, если дескриптор закрыт, все блокировки файлов, установленные вызывающим процессом, очищаются.
Подводя итог, если вы планируете использовать блокировку файлов в своих процессах, используйте следующие ограничения:
- Для каждого файла используйте один
file_lock
объект на процесс.
- Используйте один и тот же поток для блокировки и разблокировки файла.
- Если вы используете дескриптор файла std :: fstream / native для записи в файл при использовании блокировок файла для этого файла, не закрывайте файл до снятия всех блокировок файла.