我想使用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
?
答案 0 :(得分:3)
你误解了boost :: interprocess :: file_lock的目的,当你使用方法boost :: interprocess :: file_lock test_lock(“my_file”)创建一个file_lock时,你没有保护文件“my_file”不被读/写
通过其他进程,您只需声明您有一个引用文件“my_file”的锁,如果其他进程也有引用同一文件的锁,您可以在这些锁之间实现互斥,但这些锁并不关心关于文件“my_file”的读/写操作,该文件只是一个标志
答案 1 :(得分:1)
没有。但是有一种解决方法只使用一个额外的空文件。
在P2尝试扫描文件之前,创建一个名称为P1和P2都知道的空文件。在P2开始扫描之前,它将锁定该空文件并在扫描目录时释放锁定(即,在从文件读取数据时不应保持锁定)。在P1创建新文件之前,它将锁定该空文件,并在创建新文件和之后释放锁定。
答案 2 :(得分:0)
我认为你应该如何能够避免竞争条件如下:
如果不清楚,请告诉我。
谢谢,
莫希特