2013-11-26 71 views
3

我正在研究一個程序,該程序使用多個std::ifstream來讀取二進制文件,每個線程使用一個std::ifstream。現在我需要知道,如果std::ofstream在Windows和Linux上是線程安全的,用於寫入同一個文件。我正在使用僅使用一個std::ofstream並用於多個線程。
我正在使用每個線程讀取不同的塊,並使用seekp()write()將這些塊寫入輸出文件。目前它正在爲我工​​作,但它是否對大文件有問題。流屬性線程安全嗎?

std::ofstream線程安全嗎?

+1

請看下面這將有助於 請通過此 http://stackoverflow.com/questions/2754303/is-stdifstream-thread-safe-lock-free – VDN

+0

*的iostream *類是一個例外。從多個線程寫入對象是安全的。如果您不介意「這可能導致兩個線程的輸出混合在一起」。 – SChepurin

+0

另請參閱[如何輕鬆使std :: cout線程安全嗎?](http://stackoverflow.com/q/14718124/1468366) – MvG

回答

6

C++ standards(輸入/輸出庫線程安全):

27.1.3線程安全[iostreams.thread安全]

併發訪問一個流對象[string.streams,文件。流],流緩衝對象 [stream.buffers]或C庫流[c.files]多線程可能導致數據 race [intro.multithread],除非另有規定[iostream.objects]。 [注意:數據競賽 導致未定義的行爲[intro.multithread]。

+0

如何翻譯此部分「除非另有說明[iostream.objects] ...」? – SChepurin

+0

這意味着你不能假設IO庫是線程安全的(它可能取決於實現)。 – Claudix

7

如果我沒有誤解你 - 不,標準庫中沒有任何東西是線程安全的(當然,除了std::thread特定的東西(來自C++ 11和更高版本))。您需要額外的同步。

更多 - 如果有多個進程,讀取/寫入這些文件,則需要鎖定文件以同步訪問。

+2

@downvoter - 你能解釋一下嗎? –

+8

沉默downvoters吸 – Claudix

+0

我不知道我明白,如果我同時訪問(讀/寫)* differen *文件,我應該期待任何問題? – ransh

2

是的。它是。

對於Windows: 從windows上的多個線程寫入fstream是安全的。請參閱msdn文檔:Thread Safety in the C++ Standard Library

對於Linux: 總之,它是。從document of libstdc++:「如果您的平臺的C庫是線程安全的,那麼您的fstream I/O操作將在最低級別進行線程安全。」你的平臺的C庫是線程安全的嗎?是。 POSIX標準要求C stdio FILE *操作(如fread/fwrite)是原子操作,而glibc則是這樣做的。