2011-09-06 66 views
1

我有以下一段代碼(C#):它是正確的嗎?正在啓動線程並等待它們全部完成

Thread[] threads = new Thread[totalThread]; 

for (int i=0; i<totalThread; i++) { 
    threads[i] = new Thread(new ThreadStart(Work)); 
} 

sw.Start(); 

for (int j=0; j<num_threads; j++) { 
    threads[j].Start(); 
} 


for (int k=0; k<num_threads; k++) { 
    threads[k].Join();  
} 

sw.Stop(); 

sw是秒錶,work是一些方法。我想用這幾個線程來調用這個方法,但整個事情都會凍結(看起來好像沒有加入)。我需要知道我的線程處理是否好,或者如果我搞砸了。如果是後者,很明顯我的問題在於我所調用的方法,而不是線程管理。謝謝。

+5

一切看起來不錯。你可以發佈Work方法的代碼嗎? – Chandu

+4

爲什麼在下一個循環中使用'totalThread'作爲第一個循環而'num_threads'?無論如何,這個問題可能與你的'Work'方法有關,因爲上面的代碼應該沒問題。 – dlev

+0

再說一遍,不知道什麼是DoSomething()或DoSomethingElse(),看起來很難說。 totalOperation有多大?另外,你可以說'op = r.Next(2)'。 – dlev

回答

0

它是完美的,因爲它是。我沒有看到其他問題,num_threads/totalThread。請注意,如果totalThread很大(對於每個CPU內核,我認爲大於1-2),則應該使用ThreadPool

+0

我想知道-1的原因。這不是什麼問題,只是爲了知道。我的回答是正確的,建議是正確的。所以? – xanatos

0

您可以擺脫.Join循環,並在每個線程中使用ManualResetEvent。

然後等待ManualResetEvents全部變成信號。

+2

不知道爲什麼會這樣。如果'Work()'方法沒問題,上面的代碼就可以了。 – dlev

+2

究竟會是什麼區別? –

1

既然你提到過凍結。嘗試檢查你的工作方法並尋找死鎖。另外,在你的Join調用中添加一些超時機制。