2010-05-02 78 views
3

我打算使用std :: ifstream從多個線程讀取單個文件。我的關注是如果std :: ifstream是線程安全的&無鎖?是std :: ifstream線程安全和無鎖?

更多細節:

  1. 我用G ++ 4.4在Ubuntu上& Windows XP中,4.0豹。
  2. 每個線程預先創建自己的實例的std ::的ifstream的

謝謝!

回答

1

所有std庫都是線程安全的,但不是「異步」安全的。所以你可以從不同的線程調用相同的函數,但不能在相同的對象上調用。

+2

錯誤..如果你不能從多線程讀取比那是*不*線程安全。 – 2010-05-02 17:44:10

+0

將「線程安全」作爲適用於整個庫的簡單布爾條件處理有點愚蠢。例如,如果兩個線程可以同時寫入同一個文件,文件庫是線程安全的,並且庫僅僅保證所有_bytes_寫入文件?畢竟,存在緩衝的合理結果。 – MSalters 2010-05-03 10:23:15

2

這是實現定義的。標準C++完全沒有提到線程,因此對線程的任何假設本質上都會調用未指定或實現定義的行爲。

我們需要您使用的平臺更具體,但假設ifstream是線程安全的還是鎖定的,可能是不合理的。如果沒有其他的話,可能會涉及到操作系統級調用的鎖,它們實際上會從文件中讀取數據,在這種情況下,沒有真正的無鎖實現是可能的。即使沒有這些,從ifstream中讀取的每個數據都需要檢查多個格式標誌,並且需要根據讀取過程中發生的情況更新標誌位。 (即istream::good()istream::operator bool)由於沒有辦法可以完成所有這些工作,所以假設很多istream的線程安全特性是不合理的。

+0

「關於線程的任何假設固有地調用未定義的行爲」呃,我認爲它僅僅意味着未指定或實現定義。 – GManNickG 2010-05-02 17:54:04

+0

@GMan:關於g ++ 4.4&g ++ 4.0實現的任何想法? – Viet 2010-05-02 17:55:35

+0

@GMan:有什麼區別? – 2010-05-02 17:58:14

2

請參閱http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html

在撰寫該手冊頁時,GCC的標準庫遵循操作系統的C stdio文件緩衝。他們避免將結構保持在結構外部並通過它達到某種程度的安全性。

由於C stdio庫在最後I/O操作周圍的文件中實現了單個範圍的緩衝區,所以我看不到lock-free implementation是可能的。對文件的操作必須連續處理。也許無緩衝模式可能會有所幫助;這比我現在想要做的還要多一點研究。

+0

重要的是要指出,在併發領域,無鎖是比線程安全更「強」/更嚴格的概念。 – Viet 2010-05-02 19:02:14

+0

如何驗證純文本打開的文件沒有單個全局I/O鎖? – Viet 2010-05-02 19:04:03

+0

@Viet:您需要檢查您的操作系統文檔。感謝您解釋無鎖定是一個特定的術語,http://en.wikipedia.org/wiki/Lock-free。我認爲如果不是所有的C stdlib實現都會在緩衝過程中爲每個文件實現一個鎖定。這聽起來像你想要在無緩衝的,有希望的無鎖操作系統界面上實現你自己的緩衝。 – Potatoswatter 2010-05-02 19:14:19