我有一个独特的问题。有两个进程(P0 和 P1)试图访问一个文件。P0 正在向文件写入信息,P1 正在读取信息。在 P0 完成写入之前 P1 正在读取的两者之间发生竞争条件。我考虑过使用锁、信号量等。但是,P1 存在于一组我不允许以任何方式更改的代码中,并且它目前没有实现来支持上述建议的修复。
有没有办法在不触及两组代码的情况下消除这种竞争条件?
我有一个独特的问题。有两个进程(P0 和 P1)试图访问一个文件。P0 正在向文件写入信息,P1 正在读取信息。在 P0 完成写入之前 P1 正在读取的两者之间发生竞争条件。我考虑过使用锁、信号量等。但是,P1 存在于一组我不允许以任何方式更改的代码中,并且它目前没有实现来支持上述建议的修复。
有没有办法在不触及两组代码的情况下消除这种竞争条件?
您可以让 P0 写入文件 A 并让 P1 从文件 B 中读取。当 P0 完成文件写入后,将文件 A 重命名为文件 B。不过,您必须确保重命名操作是原子操作。
Niels 的解决方案很棒,但如果它是一个带有小增量的大文件,则可能不适用。我将建议您的解决方案取决于:
a)P1 是否正在锁定文件并且您只是想摆脱冲突,
b)您是否需要确保 P1 读取的始终是更新的副本与 P0 的更改,以及
c) P1 是否尊重相关文件的读锁。
此外,查找底层 O/S 系统调用,看看您是否可以从 P0 中跟踪 P1 的行为以协调进程。例如,对于 Windows,.NET System.Diagnostics.Process 类可能会提供一些有用的方法。