【问题标题】:Create a locked file with boost::interprocess::file_lock使用 boost::interprocess::file_lock 创建一个锁定文件
【发布时间】:2012-11-15 16:48:25
【问题描述】:
我想使用boost::interprocess::file_lock 来确保进程P1 写入目录x 的文件在完成之前不会被进程P2 读取。为此,我想让P1 在写入文件时用boost::interprocess::file_lock 锁定文件,然后在完成后解锁它们。然后P2 可以跳过(并返回)任何被锁定的文件。
我遇到的问题是boost::interprocess::file_lock 似乎只允许您锁定存在的文件。但是,如果我先创建文件,然后将其锁定,则会出现竞争条件:
-
P1 创建文件
-
P2 注意到文件并开始读取它
-
P1 锁定文件
-
P1写入一些数据
-
P2 读取一些数据,到达末尾,最后只得到P1 输出的一部分。
所以我想做的是创建一个文件并在创建后立即将其锁定。有没有办法使用boost::interprocess::file_lock 做到这一点?
【问题讨论】:
标签:
c++
boost
interprocess
file-locking
boost-interprocess
【解决方案1】:
您误解了 boost::interprocess::file_lock 的用途,当您使用方法 boost::interprocess::file_lock test_lock("my_file") 创建文件锁时,您并没有保护文件“my_file”不被读/写
通过其他进程,您只需声明您有一个引用文件“my_file”的锁,如果其他进程也有引用同一文件的锁,您可以在这些锁之间实现互斥,但这些锁无关紧要关于文件“my_file”的读/写操作,该文件只是一个标志
【解决方案2】:
没有。但是有一种解决方法,只使用一个额外的空文件。
在 P2 尝试扫描文件之前,使用 P1 和 P2 都知道的名称创建一个空文件。在 P2 开始扫描之前,它将锁定该空文件并在扫描完目录后释放锁定(即,它不应该在从文件中读取数据时持有锁定)。在 P1 创建新文件之前,它将锁定该空文件并在新文件创建并锁定后释放锁定。
【解决方案3】:
我认为您应该如何避免竞争条件如下:
- P1 创建文件
- P2 注意到文件:
一种。锁定它并
湾。开始阅读它
- P1 尝试锁定文件,必须等待。
- P2 完成读取,解锁文件
- P1 锁定文件
- P1 写入一些数据
如果不清楚,请告诉我。
谢谢,
莫希特