Я хотел бы использовать boost::interprocess::file_lock
чтобы гарантировать, что файлы, которые записываются в каталог x
по процессу P1
не читаются процессом P2
пока они не завершены. Для этого я бы хотел иметь P1
заблокировать файлы с boost::interprocess::file_lock
пока он их пишет, а затем разблокирует, когда все будет готово. затем P2
можно просто пропустить (и вернуться к) любые файлы, которые заблокированы.
У меня проблема в том, что кажется, что boost::interprocess::file_lock
позволяет только блокировать файлы, которые существуют. Но если я сначала создаю файл, а затем блокирую его, то возникает условие гонки, где:
P1
создает файлP2
замечает файл и начинает читатьP1
блокирует файлP1
пишет некоторые данныеP2
читает некоторые данные, доходит до конца и заканчивается только частью P1
выходной.Поэтому я хотел бы создать файл и заблокировать его, как только он будет создан. Есть ли способ сделать это с помощью boost::interprocess::file_lock
?
Вы неправильно понимаете цель boost :: interprocess :: file_lock, когда вы создаете file_lock с помощью метода boost :: interprocess :: file_lock test_lock («my_file»), вы не защищаете файл «my_file» от чтения / записи
другими процессами вы просто заявляете, что у вас есть блокировка, которая ссылается на файл «my_file», если другие процессы также имеют блокировки, ссылающиеся на тот же файл, вы можете реализовать взаимное исключение между этими блокировками, но эти блокировки не заботятся о операции чтения / записи для файла «my_file», файл является просто флагом
Нет. Но есть обходной путь, который использует только один дополнительный пустой файл.
Прежде чем P2 попытается сканировать файлы, создайте пустой файл с именем, хорошо известным как P1, так и P2. Прежде чем P2 начнет сканирование, он заблокирует этот пустой файл и снимет блокировку, когда завершит сканирование каталога (то есть он не должен удерживать блокировку при чтении данных из файлов). Прежде чем P1 создаст новый файл, он заблокирует этот пустой файл и снимет блокировку после того, как новый файл будет создан. а также заперта.
Я думаю, как вы должны быть в состоянии избежать состояния гонки следующим образом:
Дайте мне знать, если это не ясно.
Спасибо,
Мохит