J T*_*J T 5 c++ io multithreading fstream ifstream
我的应用程序中有一个包含大量信息的输入文件.按顺序读取它,并且一次只有一个文件偏移量对于我的应用程序的使用是不够的.理想情况下,我希望有两个线程,它们具有ifstream从同一文件的两个唯一文件偏移量中分离且不同的s读取.我不能只是启动一个ifstream,然后使用它的复制构造函数复制它(因为它是不可复制的).那么,我该如何处理呢? 
我马上想到两种方式,
ifstream为第二个线程构造一个新的,在同一个文件上打开它.ifstream跨两个线程共享一个开放的单个实例(例如使用boost::shared_ptr<>).当线程获得时间片时,寻求当前线程当前感兴趣的适当文件偏移量.这两种方法中的一种是首选吗?
我还没有想到第三种(或第四种)选择吗?
显然我最终受限于硬盘驱动器必须来回旋转,但我感兴趣的是(如果可能的话),同时在两个文件偏移处都有一些操作系统级磁盘缓存.
谢谢.
这两个std::ifstream实例可能是最好的选择.现代硬盘驱动器针对大量I/O请求进行了优化,因此std::ifstream同时从两个实例读取应该可以提供相当不错的性能.
如果你有一个单独的,std::ifstream你将不得不担心同步访问它,加上它可能会破坏操作系统的自动顺序访问预读缓存,导致性能较差.
在两者之间,我宁愿第二个.具有相同文件的两个空格可能会导致文件之间的视图不一致,具体取决于底层操作系统.
对于第三个选项,将引用或原始指针传递到另一个线程.只要语义是一个线程"拥有"istream,原始指针或引用就可以了.
最后请注意,在绝大多数硬件上,加载大文件时磁盘是瓶颈,而不是CPU.使用两个线程会使这更糟糕,因为您正在将顺序文件访问转换为随机访问.典型的硬盘可以顺序执行100MB/s,但最高可达3或4 MB/s随机访问.