2017-05-05 48 views

回答

0

單個std::ifstream只與一個遊標相關聯(直接與std::ifstream關聯的seekgtellg方法)。

如果你想要在多個線程中共享同一個對象std::ifstream,你必須在線程之間建立某種同步機制,這可能會失去目的(在每個線程中,你必須鎖定,每次尋找,讀取和解鎖)。

要解決您的問題,您可以打開一個std::ifstream到每個線程相同的文件。在每一個線程中,你都會尋找你想要開始閱讀的任何位置。這隻會要求你能夠「容易地」計算每個線程的查找位置(注意:這是一個非常強大的要求)。

0

C++文件流不保證是線程安全的(請參閱,例如this answer)。

典型的解決方案是無論如何在同一個文件上打開單獨的流,每個實例都帶有自己的「光標」。但是,您需要確保共享訪問,併發性將成爲特定平臺。

對於ifstream(即只從文件讀取),併發問題通常是馴服的。即使別人修改了文件,這兩個流可能會看到不同的內容,但是你確實有一些最終的一致性。

讀取和寫入通常是而不是原子,即您可能只讀取部分寫入。寫入甚至可能不會按照它們發出的順序執行(請參閱write combining)。

0

看着FILE struct它似乎有一個指針指向當前活動指針FILE,char* curp,這可能意味着對於每個FILE對象,你將有一個文件的特定部分。
這是在C中,我不知道ifstream是如何工作的,如果它使用FILE對象/它是像FILE對象一樣構建的。可能根本沒有幫助你,但我認爲分享這些小信息會很有趣,並且可能會幫助某人。

相關問題