9

我想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

4

3 回答 3

5


您误解了 boost::interprocess::file_lock 的目的,当您使用 boost::interprocess::file_lock test_lock("my_file") 方法创建 file_lock 时,您并没有保护文件“my_file”不被其他进程读取/写入,你只要声明你有一个引用文件“my_file”的锁,如果其他进程也有引用同一个文件的锁,你可以在这些锁之间实现互斥,但是这些锁并不关心读取/write 对文件“my_file”的操作,该文件只是一个标志

于 2013-12-21T13:41:53.840 回答
2

我认为您应该如何避免竞争条件如下:

  1. P1 创建文件
  2. P2 注意到文件:锁定它和 b. 开始阅读
  3. P1 尝试锁定文件,必须等待。
  4. P2 完成读取,解锁文件
  5. P1 锁定文件
  6. P1写入一些数据

如果不清楚,请告诉我。

谢谢,

莫希特

于 2014-04-07T00:25:47.453 回答
2

不可以。但是有一种解决方法,它只使用一个额外的空文件。

在 P2 尝试扫描文件之前,使用 P1 和 P2 都知道的名称创建一个空文件。在 P2 开始扫描之前,它会锁定那个空文件并在扫描完目录后释放锁定(即,它不应该在从文件中读取数据时持有锁定)。在 P1 创建新文件之前,它将锁定该空文件并在新文件创建锁定后释放锁定。

于 2012-11-15T18:15:20.517 回答