2014-04-17 29 views
0

我需要開發能夠比OS複印件使用1個線程讀取源文件,而另一個線程來寫它們複製更快的應用程序。源文件和目標文件位於不同的硬盤驅動器中。多線程文件拷貝到不同的硬盤c。使用驅動++

我的問題是如何通過結果的源讀取線程進入目標寫入線程,而不會導致一些競爭條件,仍然保持在複製過程中的頂級性能實現了比OS拷貝更快複製過程。

+2

讓我們看看你已經嘗試過的代碼。 – MrDuk

+2

如果目標駐留在同一個硬盤上,那麼添加更多線程不太可能爲性能改進做許多工作。 –

+0

操作系統的編寫者可能會花費大量時間儘可能高效地執行他們的複製例程,並且他們具有熟悉其操作系統工作方式的優勢。所以我不會屏住呼吸,得到比他們更快的結果。 –

回答

0

採用有界隊列。
你可以使用任何隊列(TBB,性病:: deque的,cirtular buffer,等等)。如果它不是線程安全的和/或阻塞,那麼在它周圍進行同步並使用conditional variables進行通知。你不需要聰明的招數在隊列中,因爲指針傳遞到數據塊到隊列的速度要快得多,則I/O,但如果你真的想過度優化再檢查disruptor(描述here)。

要評論者:請注意,問題是關於不同硬盤之間的複製,所以多線程副本受益。

+0

如果您的操作系統具有異步io,我看不到多個線程可以加快速度。當然這涉及多個線程,但在幕後 –

+0

@ W.B。我已經涉足Linux AIO,並且由於它的侷限性,用戶空間實現和複雜的API,線程更可取。 FreeBSD AIO更好,但仍然有限且太複雜。今天,這些線程是這些系統上的I/O問題的首選解決方案,AFAIK。線程在任何地方都會「正常工作」。 – ArtemGr

+0

@ W.B。如果你想要事件驅動的異步I/O,那麼使用'libuv'比使用系統的AIO更好。但事件驅動的系統本質上更復雜(我使用協程來簡化它們,所以這是一個用來簡化另一個的複雜事物)。 – ArtemGr