boost interprocess file_lock не работает с несколькими процессами - PullRequest
3 голосов
/ 14 июля 2011

Кажется, у меня проблема с boost :: interprocess :: file_lock

У меня есть процесс 1, который по существу

    boost::interprocess::file_lock test_lock("testfile.csv");
    test_lock.lock();
    sleep(1000);
    test_lock.unlock();

Когда я запускаю второй процесс, когда первый процесс спит, я обнаруживаю, что все еще могу читать testfile.csv. Что еще хуже, я могу даже перезаписать это.

Я неправильно понимаю, как работает file_lock? У меня сложилось впечатление, что вызов .lock () дает ему монопольную блокировку файла и не позволяет другим процессам читать / изменять файл.

Ответы [ 3 ]

10 голосов
/ 14 июля 2011

file_lock не для блокировки файла.Это объект взаимного исключения, использующий файл в качестве технологии поддержки.Содержимое файла в основном не имеет значения;важно то, что все экземпляры file_lock, указывающие на этот файл, будут учитывать характеристики блокировки блокировки.

Как и для любого объекта типа мьютекса, сама блокировка предназначена для защиты или иного измерения доступа к какому-либо другому ресурсу.

не имеет ничего общего с защитой файловой системы.

Ссылка

3 голосов
/ 24 октября 2012

Чтобы обеспечить переносимость, ожидаемого типа блокировки не существует в boost.В ОС Unix / Linux / OSX, которая поддерживает boost, нет принудительной блокировки на уровне ядра.

смотри:

http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock

.консультативный или кооперативный замок.Вы можете выполнить то, что вы пытаетесь сделать с помощью boost :: interprocess :: file_lock, но вы также должны использовать interprocess :: file_lock в других процессах, которые могут попытаться прочитать / записать файл.Просто попробуйте установить блокировку в другом процессе, прежде чем получить доступ к файлу.

Вот как interprocess :: file_lock был разработан для использования.Вы можете сделать это определенным для ОС способом, который обеспечивает блокировку уровня ядра, если вы работаете на некоторых ОС, но если вы используете boost :: interprocess :: file_lock, ваш код будет переносимым.

0 голосов
/ 14 июля 2011

Это не блокировка файловой системы.

Простая блокировка одного процесса не помешает другому процессу получить доступ к файлу.Думайте об этом как о мьютексе.Чтобы ваш второй процесс учитывал file_lock, вам также необходимо получить блокировку во втором процессе.Затем вы увидите, что proc2 будет блокироваться, ожидая, когда proc1 снимет блокировку.

...