2014-09-19 80 views
2

当两个进程同时打开一个不存在的文件进行写入时会发生什么?即考虑到在两个并行的进程中运行这个C++代码两个进程打开同一个文件进行写入

ofstream的OFS(“/我的/测试/路/ SOME_FILE”)

将操作系统序列化的实际文件的创建? PS:我在Windows上编码,所以我主要想看看Windows会做什么,但我很想知道这里的行为是否依赖于操作系统。

+1

这将是一个经典的竞赛条件。许多事情可能发生;一个流程打开并写入,处理两个打开,clobbers,写入,这只是麻烦的开始。 ;)当然,没有任何有用的*可以得到保证,除非“有用”是“不可预测的”。 – DavidO 2014-09-19 00:53:03

+1

我目前无法对此进行仔细检查,但该构造函数的默认行为很可能是以不共享或只读共享方式打开文件。在这种情况下,这意味着其中一个程序将创建并打开该文件,另一个将无法打开它。打开(以及必要时创建)文件的过程是原子的,所以它不会发生,一个进程将创建该文件,但另一个进程将打开它。注意:这是针对Windows的,其他操作系统有不同的行为。 – 2014-09-19 03:03:33

回答

3

对于两个打开同一个文件进行写入的过程,没有什么特别令人兴奋的。

有趣的部分开始时,这些进程都试图写入同一个文件。操作系统不会扮演裁判。当操作系统觉得它时,每个单独的进程都将由操作系统安排执行。无论过程在其时间段内做了什么,操作系统通常都会远离它。一个进程可能会向该文件写入内容,然后另一个进程可能会写入内容,或者可能不会写入内容。取决于代码的作用。

因此,除非采取明确的步骤,以某种方式,多个进程协调其对文件的访问,否则无法预测写入文件的多个进程的最终结果。计算机不会着火或内爆,世界不会结束。但是,每次这个实验重复时,结果都会有所不同。

+1

在Windows中,这取决于选择的共享模式。除非两个程序都在启用写入共享的情况下打开文件,否则只有其中一个程序会成功打开文件进行写入。默认情况下,'ofstream'构造函数启用写共享是不太可能的。 – 2014-09-19 03:02:00

相关问题