2013-02-14 131 views
0
List<ManualResetEvent> doneEventsList = new List<ManualResetEvent>(); 

productBuilders.ForEach(productBuilder => 
      { 
       doneEventsList.Add(productBuilder.GetDoneEvent()); 
       CustomThreadPool.getSingletonInstance.QueueUserWorkItem(productBuilder.GetAndMapProduct, new Object()); 
      }); 

      WaitHandle.WaitAll(doneEventsList.ToArray()); 

我對上面的代碼小疑問,不ManualResetEvent的設置爲true

比方說CustomThreadPool有「Thread‘類的21個實例列表和’productBuilders」有3名建設者。在這種情況下,線程獲取計數將從CustomThreadPool獲得'3'。假設如果我沒有在3'GetAndMapProduct'調用中的任何一個對ManualResetEvent對象設置'Set()/ true',那麼這3個線程會發生什麼。我的意思是,如果我循環7次以上的代碼,每次獲取3個線程,而不是設置ManualResetEvent,我不能使用CustomThreadPool類嗎?因爲CustomThreadPool假定所有(7 * 3)線程都忙於工作,它不會有任何免費線程分配?

+0

一個線程池調度程序的工作,甚至是一個自定義線程池調度程序的工作是*不讓*所有線程同時啓動。 – 2013-02-14 14:32:25

回答

1

您還沒有提供任何代碼建議ManualResetEvent影響任意這3個線程。他們唯一會影響(根據您的代碼)將是當前線程通過調用WaitAll,並根據您提供和描述,這將是一個僵局。

如果你只在同一進程管理不同的線程,我也建議使用ManualResetEventSlimhttp://msdn.microsoft.com/en-us/library/system.threading.manualreseteventslim.aspx)代替,尤其是當你在做什麼在GetAndMapProduct是相當快的。但是,你真的不清楚你想完成什麼。

相關問題