我有線程的列表,我試圖讓我的主線程等待所有線程的列表,終止:任何方式來自動檢查是否存在列表項和列表項上的調用方法?
while (consumers.Count > 0) consumers[0].Join();
的問題是,這是不是原子,並我可以得到一個「索引超出範圍」的例外。
是否有任何原子方法來檢查消費者[0]的存在和調用消費者[0] .Join()?
注:我不能做
lock (myLocker) { if (consumers.Count > 0) consumers[0].Join(); }
,因爲我不想訪問消費者而停留在加入()阻止其他線程。
除了我的副本會立即失效。 我想如果線程已經終止thread.Join()會失敗? – mbeckish 2009-08-13 19:38:27
對消費者的所有其他訪問都是同步的。讓我知道如果看到任何其他代碼會有所幫助。 – mbeckish 2009-08-13 19:39:10
@mbeckish:您的副本將總是*在您訪問它時立即失效 - 並且您關於Thread.Join的直覺不正確,如文檔所述:「如果在調用Join時線程已經終止,則該方法立即返回。鑑於你不能原子地「檢查線程狀態並調用Join」任何Join API,如果該線程已經終止,則會由於設計而中斷該異常。 – 2009-08-13 19:40:35