2014-09-19 135 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

相關問題