【问题标题】:Mutual Exclusion Without Touching Both Processes不涉及两个进程的互斥
【发布时间】:2010-07-30 17:15:31
【问题描述】:

我有一个独特的问题。有两个进程(P0 和 P1)试图访问一个文件。 P0 正在向文件写入信息,P1 正在读取信息。在 P0 完成写入之前 P1 正在读取的两者之间发生竞争条件。我考虑过使用锁、信号量等。但是,P1 存在于一组我不允许以任何方式更改的代码中,并且它目前没有实现来支持上述建议的修复。

有什么方法可以在不触及两组代码的情况下消除这种竞争条件?

【问题讨论】:

    标签: locking semaphore race-condition mutual-exclusion


    【解决方案1】:

    您可以让 P0 写入文件 A,让 P1 从文件 B 中读取。当 P0 完成文件写入后,将文件 A 重命名为文件 B。不过,您必须确保重命名操作是原子操作。

    【讨论】:

    • 这实际上是我对这个问题的临时解决方案。它解决了大部分问题(与在屏幕上显示图像有关),但问题的元素仍然存在。我怀疑重命名操作不是完全原子的。它在Linux机器上运行,我读过它与POSIX标准不完全兼容。
    • 如果先删除 B 再将 A 重命名为 B 会怎样? P1会抛出错误并退出吗?
    • 程序正常进行。我注意到删除非临时文件对冲突没有影响。 P1 也恰好是 Web 服务器代码,我什至无法查看。可能是这个问题中的未知参数太多。
    【解决方案2】:

    Niels 的解决方案很棒,但如果它是具有小增量的大文件,则可能不适用。 我将建议您的解决方案取决于:
    a) P1 是否正在锁定文件,而您只是想摆脱冲突,
    b) 您是否需要确保 P1 读取的始终是具有 P0 更改的更新副本,以及
    c) P1 是否支持相关文件的读锁。

    另外,查找底层的 O/S 系统调用,看看您是否可以从 P0 中跟踪 P1 的行为以协调进程。例如,对于 Windows,.NET System.Diagnostics.Process 类可能会提供一些有用的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多