-4

我有以下算法與文件工作:C++多線程問題

//open ifstram to read each line 

//open ofstream to output each line 

while (getline(ifstream, line1)){ 

getline(ifstream, line2) ; 
getline(ifstream, line3) ; 
getline(ifstream, line4) ; 
// 
getline(ifstream, line10) ; 

for(int i = 1 ; i <= 10 ; i++) 
// process line number i (some sort of character replacement, substring extraction) 

output each line 

} 

現在,爲了使我的代碼更快我想執行多線程。但是,我不明白,如何使用多線程運行上述算法,因此我將更快地獲得&的正確輸出。任何建議都會有幫助。

+0

如果你希望得到一個答案,你應該提供一些工作代碼 - 這不是。如果你不這樣做,你的問題可能會被關閉。 – mvp 2013-02-12 11:52:32

+1

爲什麼標記爲C? – 2013-02-12 11:52:37

+0

其實,我不知道如何在多線程中運行以上算法。我必須執行大量的I/O操作,但我不知道如何使I/O線程獨立。 – user1838343 2013-02-12 11:53:57

回答

2
  1. 多線程並不一定會導致更快的程序。
  2. 是否這可以完成取決於你在那裏做什麼樣的處理。如果它是按字符串完成的並且不依賴於以前的結果,則可以在C++ 11中使用std :: future。如果您不想使用C++ 11,請指定做什麼想要使用。
  3. 如果這是你想要做的,你不能從串行流中並行地引導多行。原因應該是顯而易見的。
+0

實際上,我想通過線程1讀取第1-10行,第20-30行,通過第2行讀取第10-20,30-40行。這可能嗎?以及如何輸出相同的文件? – user1838343 2013-02-12 12:02:02

+0

不,那不行。 – Cubic 2013-02-12 12:13:20

+0

+1有線程通信開銷。爲了使這個開銷值得,值得交流的工作應該是實質性的。 10行文字不重要。 10000行文字*可能會使其值得。 – 2013-02-12 12:42:27

0

如果我正確理解你的問題,你正試圖從一個流中讀取並以塊讀取材料。

本例中有幾種並行化機會。

  1. 如果您正在讀取文件,操作系統可以在處理第一個塊時繼續將文件內容讀入緩衝區。

  2. 如果您正在閱讀的來源不是真正線性的,您可以創建多個流和幾個工作人員,每個人都在自己的一組塊上工作。

  3. 在無法控制數據源的情況下,下一個機會是使單個I/O線程將讀取塊放入某種類型的隊列中,以驅動任意數量的工人。這與#2類似,但分裂發生在你的過程中。這可能是有用的,例如如果您需要保留組塊之間的順序,在這種情況下,單個輸出工作人員會再次將隊列收集到隊列中,並在到達時對其進行排序和輸出。

其中哪一個實際適用於您的情況只能由您決定。此外,取決於I/O所需的處理和線程的開銷的比率,將溶液#3可能是

  • 有害(高螺紋的開銷相比,低的I/O和低加工成本)
  • 唯一有用(低線程開銷並且處理成本低於I/O;在這種情況下,單個工人將在讀取下一個塊之前完成處理)
  • 受平臺中內核數量的限制(低線程開銷和I/O成本,但高處理;在這種情況下,額外的工作人員只會爭取有限的資源,如緩存,這會導致不必要的低效率)