我有多個線程,我希望他們每個人都能處理我的文件的一部分。我可以有一個ifstream對象,並讓它們同時讀取不同的部分?這些部分不重疊,所以同一行不會被兩個線程處理。如果是,如何獲得多個遊標?你可以爲同一個ifstream有多個「遊標」嗎?這是線程安全的嗎?
4
A
回答
0
單個std::ifstream
只與一個遊標相關聯(直接與std::ifstream
關聯的seekg
和tellg
方法)。
如果你想要在多個線程中共享同一個對象std::ifstream
,你必須在線程之間建立某種同步機制,這可能會失去目的(在每個線程中,你必須鎖定,每次尋找,讀取和解鎖)。
要解決您的問題,您可以打開一個std::ifstream
到每個線程相同的文件。在每一個線程中,你都會尋找你想要開始閱讀的任何位置。這隻會要求你能夠「容易地」計算每個線程的查找位置(注意:這是一個非常強大的要求)。
0
C++文件流不保證是線程安全的(請參閱,例如this answer)。
典型的解決方案是無論如何在同一個文件上打開單獨的流,每個實例都帶有自己的「光標」。但是,您需要確保共享訪問,併發性將成爲特定平臺。
對於ifstream
(即只從文件讀取),併發問題通常是馴服的。即使別人修改了文件,這兩個流可能會看到不同的內容,但是你確實有一些最終的一致性。
讀取和寫入通常是而不是原子,即您可能只讀取部分寫入。寫入甚至可能不會按照它們發出的順序執行(請參閱write combining)。
0
看着FILE struct它似乎有一個指針指向當前活動指針FILE,char* curp
,這可能意味着對於每個FILE對象,你將有一個文件的特定部分。
這是在C中,我不知道ifstream是如何工作的,如果它使用FILE對象/它是像FILE對象一樣構建的。可能根本沒有幫助你,但我認爲分享這些小信息會很有趣,並且可能會幫助某人。
相關問題
- 1. 寫這個是線程安全的嗎?
- 2. 這個servlet是線程安全的嗎?
- 3. 這是多線程迭代安全嗎?
- 4. 這個Singleton是一個線程安全的嗎?
- 5. 多個用戶可以同時提交給SVN嗎?線程安全嗎?
- 6. 這個java類線程安全嗎?
- 7. 這個html helper線程安全嗎?
- 8. 這個遊標可以被替換嗎
- 9. 同一對象(C++)的多個副本:線程安全嗎?
- 10. 多個遊標 - 可能嗎?
- 11. 這些類是線程安全的嗎?
- 12. 這些線程安全嗎?
- 13. 這是一個安全的連接嗎?
- 14. MySQLdb連接和遊標對象可以安全地使用多線程嗎?
- 15. 這是使用Parallel.ForEach()線程安全嗎?
- 16. 你可以爲同一個x座標繪製多個y點嗎?
- 17. 你可以有多個庫嗎?
- 18. 你可以有多個domready事件嗎?
- 19. 你可以執行一行作爲python線程的目標嗎?
- 20. 這可能被認爲是一個安全漏洞嗎?
- 21. 這是一個有效的,懶惰的,線程安全的Singleton實現C#嗎?
- 22. python函數是線程安全嗎? (特別是這個?)
- 23. 使用這個問題我可以有線程安全問題嗎?
- 24. 證明這個類是線程安全的嗎?
- 25. 這個python代碼是線程安全的嗎?
- 26. 一個線程可以同時持有兩個鎖嗎?
- 27. 這個同步對象實現線程安全嗎?
- 28. 你可以在同一個類中有一個textSwitcher和imageSwitcher嗎?
- 29. 是否可以同時從多個線程調用write()安全?
- 30. 是jBPM executionservice多線程安全嗎?