2010-10-28 108 views
4

如果從不同的進程/線程同時訪問文件會發生什麼? 我明白沒有標準的方式來鎖定文件,只有os特定的功能。C++ fstream併發訪問

在我的情況下,文件將經常閱讀和書面很少。 現在如果A打開文件讀取(ifstream)並開始讀取塊。並B打開寫作(ofstream)相同的文件,並開始寫作。會發生什麼?有沒有定義的行爲?

編輯 我的目標是對許多文件的併發讀寫訪問。但寫訪問不會經常發生。如果fstreams保證文件內容不會混淆,我會很滿意。

例如: 進程1和2寫入文件A.如果它們併發寫入,我不在乎是否將1或2的版本寫入磁盤,只要它是該文件的一致版本即可。

如果一個進程讀取一個文件而另一個進程同時寫入,我希望讀取進程獲得文件的「舊」版本。

如果fstreams不處理這個問題,我將使用一個數據庫。

+1

如您所說,這是所有操作系統特定的。你在使用哪種操作系統?或者您在尋找便攜式解決方案嗎? – 2010-10-28 10:14:08

+0

便攜式是首選,但我在Linux上。問題是如果fstreams有一個定義的行爲... – tauran 2010-10-28 10:15:24

+0

據我所知,不,沒有定義的行爲。 – 2010-10-28 10:55:21

回答

7

使用C++確實沒有可移植的方式來進行有效的文件共享(同時訪問)。

  1. 您可以使用「鎖定」文件共享文件。在打開「foo.dat」之前,嘗試創建文件「foo.lock」。保持循環,直到你成功。訪問後,刪除foo.lock。這允許串行訪問,但不允許併發訪問。

  2. 您可以按平臺特定的方式使用字節級鎖定。 Windows有LockFileEx()。 POSIX有fcntl和羊羣。如果你需要多平臺,你需要單獨的實現。您可以將它們封裝在一個類中,並使用#if來處理平臺特定的位。 這是最高效的(最快)很多,但它涉及非常複雜的編程,並且容易出錯。

  3. 您可以使用DBMS。

一個DBMS將很多,最簡單的,但它確實配合你可能會或可能不會是一個問題的外部產品。字節式鎖定比其他任何方式都快得多,但會增加開發和維護成本。

1

你的目標是什麼?你是否試圖阻止對文件的併發讀/寫操作,或者你想通過文件實現某種形式的IPC?

無論哪種方式,看看提升interprocess,它爲您提供了使用文件鎖定(和IPC的其他酷東西)的機會,並且它具有便攜的額外優勢!