我打算使用std :: ifstream從多個線程讀取單個文件。我的關注是如果std :: ifstream是線程安全的&無鎖?是std :: ifstream線程安全和無鎖?
更多細節:
- 我用G ++ 4.4在Ubuntu上& Windows XP中,4.0豹。
- 每個線程預先創建自己的實例的std ::的ifstream的
謝謝!
我打算使用std :: ifstream從多個線程讀取單個文件。我的關注是如果std :: ifstream是線程安全的&無鎖?是std :: ifstream線程安全和無鎖?
更多細節:
謝謝!
所有std庫都是線程安全的,但不是「異步」安全的。所以你可以從不同的線程調用相同的函數,但不能在相同的對象上調用。
這是實現定義的。標準C++完全沒有提到線程,因此對線程的任何假設本質上都會調用未指定或實現定義的行爲。
我們需要您使用的平臺更具體,但假設ifstream是線程安全的還是鎖定的,可能是不合理的。如果沒有其他的話,可能會涉及到操作系統級調用的鎖,它們實際上會從文件中讀取數據,在這種情況下,沒有真正的無鎖實現是可能的。即使沒有這些,從ifstream中讀取的每個數據都需要檢查多個格式標誌,並且需要根據讀取過程中發生的情況更新標誌位。 (即istream::good()
和istream::operator bool
)由於沒有辦法可以完成所有這些工作,所以假設很多istream
的線程安全特性是不合理的。
請參閱http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html。
在撰寫該手冊頁時,GCC的標準庫遵循操作系統的C stdio文件緩衝。他們避免將結構保持在結構外部並通過它達到某種程度的安全性。
由於C stdio庫在最後I/O操作周圍的文件中實現了單個範圍的緩衝區,所以我看不到lock-free implementation是可能的。對文件的操作必須連續處理。也許無緩衝模式可能會有所幫助;這比我現在想要做的還要多一點研究。
重要的是要指出,在併發領域,無鎖是比線程安全更「強」/更嚴格的概念。 – Viet 2010-05-02 19:02:14
如何驗證純文本打開的文件沒有單個全局I/O鎖? – Viet 2010-05-02 19:04:03
@Viet:您需要檢查您的操作系統文檔。感謝您解釋無鎖定是一個特定的術語,http://en.wikipedia.org/wiki/Lock-free。我認爲如果不是所有的C stdlib實現都會在緩衝過程中爲每個文件實現一個鎖定。這聽起來像你想要在無緩衝的,有希望的無鎖操作系統界面上實現你自己的緩衝。 – Potatoswatter 2010-05-02 19:14:19
錯誤..如果你不能從多線程讀取比那是*不*線程安全。 – 2010-05-02 17:44:10
將「線程安全」作爲適用於整個庫的簡單布爾條件處理有點愚蠢。例如,如果兩個線程可以同時寫入同一個文件,文件庫是線程安全的,並且庫僅僅保證所有_bytes_寫入文件?畢竟,存在緩衝的合理結果。 – MSalters 2010-05-03 10:23:15