2012-02-13 104 views
2

我最近試圖找出一個ThreadPool類的解決方案如何在.NET 4.0中工作。我試圖通讀反射代碼,但對我來說似乎有點過分。在.NET 4.0中如何實現ThreadPool?

有人能深入淺出的講解這個類是如何工作的,即

  1. 它如何存儲了在
  2. 未來各方法難道是線程安全的,理應多線程試圖排隊的線程池中的方法?
  3. 當它達到可用線程的限制時,當其中一個線程變爲空閒時,它將如何返回以執行隊列中正在等待的其餘批處理?是否有一些回調機制?
+1

僅供參考,ThreadPool類是.NET的一部分,不屬於C# – 2012-02-13 00:53:48

回答

2

當然,在沒有實際執行的(或在沒有埃裏克利珀的:)),我說的只是常識:

  1. 線程池擁有一個內部(循環?)隊列的任務保存(因此QueueUserWorkItem)。
  2. 將任務放入隊列中是線程安全的(這是肯定的,因爲我已經在這種場景中多次使用了自己)。
  3. 我認爲每個線程都會無限循環,並在完成當前任務時自動從隊列中取出任務(當然,線程安全方式)。如果隊列是空的,它將會阻塞。
+0

我對線程池如何實現沒有特別的神祕知識。你的解釋似乎是合理的。 – 2012-02-13 16:57:18

+0

@Eric Lippert:等等,你怎麼知道這個帖子提到你? AHA,所以你確實有某種隱藏的權力。無論是那個還是M $都在監視着我的一舉一動。 – Tudor 2012-02-13 17:10:59

+2

我使用http://stackoverflow.com/search?tab=newest&q=lpert的奧術力量 – 2012-02-13 17:21:51

-1
  1. 我不知道exectly,但在我看來它存儲的 集合中的任務
  2. MSDN說是

  3. GetMaxThreads()返回一次性執行的線程數量如果 你到達這個邊界,所有其他人都排隊。據我所知, 需要知道何時執行線程的機制。有 RegisterWaitForSingleObject(WaitHandle中,WaitOrTimerCallback,對象,的Int32,布爾)

+2

點1絕對不是真的。線程池早在爲.NET創建Task類之前就已經實現。 – 2012-02-13 01:34:10

1
  1. 在代表

  2. 隊列TBH,我不知道是肯定的,但如果它不是,它很危險,幾乎沒用,可能是M $發出的最差代碼(甚至包括Windows ME)。假設它是線程安全的。

  3. 工作線程是while循環,等待委託的工作請求隊列,當它變得可用時調用一個,然後當委託返回以再次等待另一個委託時在隊列中再次循環。不需要任何回調。

+1

.NET 4中的注意事項是池中的每個線程都有一個委託隊列,以防止工作量的增加以平衡負載。這已經記錄在MSDN博客上(從並行編程小組開始:http://blogs.msdn.com/b/pfxteam/)。 – Richard 2012-02-13 10:07:54

+1

@Richard - 我懷疑是這樣,但並不想讓事情複雜化 - 總體設計和效果都是一樣的,每個線程和工作的隊列是一個性能增強。 – 2012-02-13 11:50:58

+8

http://penny-arcade.com/comic/2002/07/22 – 2012-02-13 16:59:38