c++ - 使用 ifstream 在两个线程中处理同一个文件

标签 c++ multithreading io fstream ifstream

我的应用程序中有一个包含大量信息的输入文件。按顺序读取它,并且一次只有一个文件偏移量不足以满足我的应用程序的使用。理想情况下,我想要两个线程,它们具有独立且不同的 ifstream s 从同一文件的两个唯一文件偏移量读取。我不能只开始一个 ifstream起来,然后使用它的复制构造函数复制它(因为它是不可复制的)。 那么,我该如何处理呢?

马上想到两种办法,

  1. 构建一个新的 ifstream对于第二个线程,在同一个文件上打开它。
  2. 共享一个打开的实例 ifstream跨两个线程(例如使用 boost::shared_ptr<> )。当线程获得时间片时,寻找当前线程当前感兴趣的适当文件偏移量。

这两种方法中的一种是首选吗?

有没有我还没有想到的第三(或第四)种选择?

显然,我最终受限于必须来回旋转的硬盘驱动器,但我有兴趣利用(如果可能的话)是同时在两个文件偏移处进行一些操作系统级别的磁盘缓存。

谢谢。

最佳答案

两个 std::ifstream 实例可能是这里的最佳选择。现代 HDD 针对大量 I/O 请求进行了优化,因此同时从两个 std::ifstream 实例读取应该会提供相当不错的性能。

如果您只有一个 std::ifstream,您将不得不担心同步访问它,而且它可能会破坏操作系统的自动顺序访问预读缓存,从而导致性能下降.

关于c++ - 使用 ifstream 在两个线程中处理同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216643/

相关文章:

c# - 这是为了线程安全而锁定的正确对象吗?

c - 使用 fread 从文本文件读取时获取 '�' 或 '@' 符号

c++ - 模板无法将函数定义与现有声明相匹配

c++ - 返回 shared_ptr 和异常安全

c++ - 比 MFC 更好的框架?

c++ - 封装线程会产生问题

c++ - 如何在多线程 C++ 中实现 "soft barrier"

c++ - 如何添加 gstreamer 插件?

Java - 最佳实践 - 如何批量复制多个文件?

java - 关闭 Java 中的包装资源