我有多个线程,我希望他们每个人都能处理我的文件的一部分。我可以有一个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. 多个用户可以同时提交给SVN吗?线程安全吗?
- 3. 这个Python代码线程安全吗?
- 4. 多个游标 - 可能吗?
- 5. 这些类是线程安全的吗?
- 6. 这些线程安全吗?
- 7. 这是一个安全的连接吗?
- 8. MySQLdb连接和游标对象可以安全地使用多线程吗?
- 9. 这是使用Parallel.ForEach()线程安全吗?
- 10. 你可以为同一个x坐标绘制多个y点吗?
- 11. 你可以有多个domready事件吗?
- 12. 这可能被认为是一个安全漏洞吗?
- 13. 这是一个有效的,懒惰的,线程安全的Singleton实现C#吗?
- 14. python函数是线程安全吗? (特别是这个?)
- 15. 使用这个问题我可以有线程安全问题吗?
- 16. 一个线程可以同时持有两个锁吗?
- 17. 这个python代码是线程安全的吗?
- 18. 证明这个类是线程安全的吗?
- 19. 是否可以同时从多个线程调用write()安全?
- 20. 一个类可以有多个线程函数吗?
- 21. 是DatagramSocket.send线程安全吗?
- 22. 是TcpClient.Available线程安全吗?
- 23. 线程安全(是吗?)
- 24. 是unique_ptr线程安全吗?
- 25. 是System.DirectoryServices.AccountManagement.GroupPrincipal线程安全吗?
- 26. 是sqlite.swift线程安全吗?
- 27. 是DocumentBuilder.parse()线程安全吗?
- 28. 是Microsoft.Practices.EnterpriseLibrary.Data.Database.SetParameterValue线程安全吗?
- 29. 是长线程安全吗?
- 30. 是javax.sql.DataSource线程安全吗?