【问题标题】:Multithread file copy to different hard drive using c++使用c ++将多线程文件复制到不同的硬盘驱动器
【发布时间】:2014-06-02 01:27:41
【问题描述】:

我需要开发一个应用程序,它可以比使用 1 个线程读取源文件和另一个线程来写入源文件的操作系统复制速度更快。源文件和目标文件位于不同的硬盘中。

我的问题是如何将源读取线程的结果传递到目标写入线程而不导致一些竞争条件,并且仍然保持复制过程的最佳性能以实现比操作系统复制更快的复制过程。

【问题讨论】:

  • 向我们展示您已经尝试过的代码。
  • 如果目标驻留在同一个硬盘上,恕我直言,添加更多线程不太可能对性能提升有很大帮助。
  • 操作系统的编写者可能已经花费了大量时间使他们的复制例程尽可能高效,并且他们拥有对操作系统如何工作的深入了解的优势。所以我不会屏息以待获得比他们更快的结果。

标签: c++ multithreading file copy


【解决方案1】:

使用有界队列。
您可以使用任何队列(TBB、std::deque、cirtular buffer,等等)。如果它不是线程安全的和/或阻塞的,那么围绕它进行同步并使用conditional variables 进行通知。您不需要在队列中使用智能技巧,因为将指向数据块的指针传递到队列中比 I/O 快得多,但是如果您真的想过度优化,请检查 disruptor(描述为 @987654325 @)。

致审阅者:请注意,问题是关于在不同硬盘驱动器之间进行复制,因此多线程复制受益。

【讨论】:

  • 如果您的操作系统有异步 io,我看不出多线程如何加快速度。当然这涉及到多个线程,但在幕后
  • @W.B.我涉足过 Linux AIO,由于它的局限性、用户空间实现和复杂的 API,线程更可取。 FreeBSD AIO 更好,但仍然有限且过于复杂。今天,线程是这些系统上 I/O 问题的首选解决方案,AFAIK。线程将“正常工作”,无处不在。
  • @W.B.如果您想要事件驱动的异步 I/O,那么使用libuv 比使用系统的 AIO 更好。但是事件驱动系统本质上更复杂(我使用协程来简化它们,所以用一个复杂的东西来简化另一个=)。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多