Создайте заблокированный файл с помощью boost :: interprocess :: file_lock

Я хотел бы использовать boost::interprocess::file_lock чтобы гарантировать, что файлы, которые записываются в каталог x по процессу P1 не читаются процессом P2 пока они не завершены. Для этого я бы хотел иметь P1 заблокировать файлы с boost::interprocess::file_lock пока он их пишет, а затем разблокирует, когда все будет готово. затем P2 можно просто пропустить (и вернуться к) любые файлы, которые заблокированы.

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

  1. P1 создает файл
  2. P2 замечает файл и начинает читать
  3. P1 блокирует файл
  4. P1 пишет некоторые данные
  5. P2 читает некоторые данные, доходит до конца и заканчивается только частью P1выходной.

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

6

Решение

Вы неправильно понимаете цель boost :: interprocess :: file_lock, когда вы создаете file_lock с помощью метода boost :: interprocess :: file_lock test_lock («my_file»), вы не защищаете файл «my_file» от чтения / записи
другими процессами вы просто заявляете, что у вас есть блокировка, которая ссылается на файл «my_file», если другие процессы также имеют блокировки, ссылающиеся на тот же файл, вы можете реализовать взаимное исключение между этими блокировками, но эти блокировки не заботятся о операции чтения / записи для файла «my_file», файл является просто флагом

3

Другие решения

Нет. Но есть обходной путь, который использует только один дополнительный пустой файл.

Прежде чем P2 попытается сканировать файлы, создайте пустой файл с именем, хорошо известным как P1, так и P2. Прежде чем P2 начнет сканирование, он заблокирует этот пустой файл и снимет блокировку, когда завершит сканирование каталога (то есть он не должен удерживать блокировку при чтении данных из файлов). Прежде чем P1 создаст новый файл, он заблокирует этот пустой файл и снимет блокировку после того, как новый файл будет создан. а также заперта.

1

Я думаю, как вы должны быть в состоянии избежать состояния гонки следующим образом:

  1. P1 создает файл
  2. P2 замечает файл:
    а. Блокирует это и
    б. Начинает читать
  3. P1 пытается получить блокировку файла, должен ждать.
  4. P2 закончил чтение, разблокировал файл
  5. P1 блокирует файл
  6. P1 записывает некоторые данные

Дайте мне знать, если это не ясно.

Спасибо,

Мохит

0
По вопросам рекламы [email protected]