【问题标题】: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 似乎只允许您锁定存在的文件。但是,如果我先创建文件,然后将其锁定,则会出现竞争条件:

  1. P1 创建文件
  2. P2 注意到文件并开始读取它
  3. P1 锁定文件
  4. P1写入一些数据
  5. 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】:

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

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

        如果不清楚,请告诉我。

        谢谢,

        莫希特

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-10
          • 1970-01-01
          • 1970-01-01
          • 2020-09-09
          • 1970-01-01
          • 2010-10-03
          • 2021-05-19
          相关资源
          最近更新 更多