我的应用程序中有一个包含大量信息的输入文件。按顺序读取它,并且一次只有一个文件偏移量不足以满足我的应用程序的使用。理想情况下,我想要两个线程,它们具有独立且不同的 ifstream
s 从同一文件的两个唯一文件偏移量读取。我不能只开始一个 ifstream
起来,然后使用它的复制构造函数复制它(因为它是不可复制的)。 那么,我该如何处理呢?
马上想到两种办法,
- 构建一个新的
ifstream
对于第二个线程,在同一个文件上打开它。 - 共享一个打开的实例
ifstream
跨两个线程(例如使用boost::shared_ptr<>
)。当线程获得时间片时,寻找当前线程当前感兴趣的适当文件偏移量。
这两种方法中的一种是首选吗?
有没有我还没有想到的第三(或第四)种选择?
显然,我最终受限于必须来回旋转的硬盘驱动器,但我有兴趣利用(如果可能的话)是同时在两个文件偏移处进行一些操作系统级别的磁盘缓存。
谢谢。
最佳答案
两个 std::ifstream
实例可能是这里的最佳选择。现代 HDD 针对大量 I/O 请求进行了优化,因此同时从两个 std::ifstream
实例读取应该会提供相当不错的性能。
如果您只有一个 std::ifstream
,您将不得不担心同步访问它,而且它可能会破坏操作系统的自动顺序访问预读缓存,从而导致性能下降.
关于c++ - 使用 ifstream 在两个线程中处理同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216643/