使用boost :: interprocess :: file_lock创建一个锁定的文件

时间:2012-11-15 16:48:25

标签: c++ boost interprocess file-locking boost-interprocess

我想使用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部分输出。
  6. 所以我想做的就是创建一个文件,并在创建文件后立即将其锁定。有没有办法使用boost::interprocess::file_lock

    执行此操作

3 个答案:

答案 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)

我认为你应该如何能够避免竞争条件如下:

  1. P1创建文件
  2. P2注意到文件: 一个。锁定它和 湾开始阅读
  3. P1尝试锁定文件,必须等待。
  4. P2完成阅读,解锁文件
  5. P1锁定文件
  6. P1写一些数据
  7. 如果不清楚,请告诉我。

    谢谢,

    莫希特