【问题标题】:Reading and writing to different files on the same time - can multithreading be useful?同时读取和写入不同的文件 - 多线程有用吗?
【发布时间】:2020-12-09 16:13:57
【问题描述】:

我正在逐行读取一个大文件中的文本,对它们执行一些操作,然后将结果存储在不同的文件中。如果我有两个线程,一个从一个文件中读取数据,另一个线程是否能够同时将数据写入另一个文件?还是因为它们是同一个硬盘,所以多线程没有意义,因为它们会互相等待?

【问题讨论】:

  • 如果您有 SSD,它会非常有用。如果不是,这将取决于几个因素。
  • 请提供您的目标操作系统和体系结构的一些详细信息,包括磁盘技术(HDD、SSD、SAN、RAID)等。您应该期望平台会努力尽量减少这种争用,但如果您'正在写入具有单个写入头缓冲的单个盘片主轴,而聪明只能缓解目前的情况。在 C++ 中增加缓冲区大小可能是有意义的。理论上,您可以调整缓冲区大小以减少读取器和写入器之间的争用。阅读、工作、阅读交错工作、写作、工作。
  • @Persixty 我希望它是跨平台的,因此不使用任何特定于操作系统或特定于硬件的东西。只是一些通用代码,但尽可能高效
  • 那么答案是“这取决于您的硬件平台的具体情况”。我想说你应该考虑缓冲,因为原则上这应该有助于减轻工作量,但如果进程在读取和进程和写入之间不平衡,你可能仍然会在缓冲区中备份数据。您可能需要多个读取器/写入器/处理器才能在某些平台上获得吞吐量。想要一个独立于平台的解决方案并不意味着有一个,因为平台各不相同。

标签: c++ multithreading file c++11


【解决方案1】:

如果我理解正确的话,你有三个步骤

  • 阅读
  • 进程

当然,硬盘不能同时进行读写操作。但是,它可以支持这一点:

  • 阅读 A(高清)
  • 读取 B (HD),进程 A (CPU)
  • 写入 A (HD),进程 B (CPU)
  • 读取 C(高清)
  • 写入 B (HD),进程 C (CPU)
  • ...

简而言之,在处理过程中,您的程序受 CPU 限制,而 HD 处于空闲状态。在写入时,它是 HD-bound(或 IO-bound)并且 CPU 处于空闲状态。交错这些东西可以提高整体吞吐量。

【讨论】:

  • 不要忘记现代计算机大量缓存 I/O。
  • 谢谢!我也朝那个方向发展。另外,如果您不介意再问一个问题,因为我真的不知道程序有多少数据部分以及我能够创建多少线程,我可以以 std::async 启动进程,所以系统将决定它是否可以创建线程。使用 std::async 不可能降低程序的速度,对吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多