我最近試圖找出一個ThreadPool類的解決方案如何在.NET 4.0中工作。我試圖通讀反射代碼,但對我來說似乎有點過分。在.NET 4.0中如何實現ThreadPool?
有人能深入淺出的講解這個類是如何工作的,即
- 它如何存儲了在
- 未來各方法難道是線程安全的,理應多線程試圖排隊的線程池中的方法?
- 當它達到可用線程的限制時,當其中一個線程變爲空閒時,它將如何返回以執行隊列中正在等待的其餘批處理?是否有一些回調機制?
我最近試圖找出一個ThreadPool類的解決方案如何在.NET 4.0中工作。我試圖通讀反射代碼,但對我來說似乎有點過分。在.NET 4.0中如何實現ThreadPool?
有人能深入淺出的講解這個類是如何工作的,即
當然,在沒有實際執行的(或在沒有埃裏克利珀的:)),我說的只是常識:
QueueUserWorkItem
)。我對線程池如何實現沒有特別的神祕知識。你的解釋似乎是合理的。 – 2012-02-13 16:57:18
@Eric Lippert:等等,你怎麼知道這個帖子提到你? AHA,所以你確實有某種隱藏的權力。無論是那個還是M $都在監視着我的一舉一動。 – Tudor 2012-02-13 17:10:59
我使用http://stackoverflow.com/search?tab=newest&q=lpert的奧術力量 – 2012-02-13 17:21:51
MSDN說是
GetMaxThreads()返回一次性執行的線程數量如果 你到達這個邊界,所有其他人都排隊。據我所知, 需要知道何時執行線程的機制。有 RegisterWaitForSingleObject(WaitHandle中,WaitOrTimerCallback,對象,的Int32,布爾)
點1絕對不是真的。線程池早在爲.NET創建Task類之前就已經實現。 – 2012-02-13 01:34:10
在代表
隊列TBH,我不知道是肯定的,但如果它不是,它很危險,幾乎沒用,可能是M $發出的最差代碼(甚至包括Windows ME)。假設它是線程安全的。
工作線程是while循環,等待委託的工作請求隊列,當它變得可用時調用一個,然後當委託返回以再次等待另一個委託時在隊列中再次循環。不需要任何回調。
.NET 4中的注意事項是池中的每個線程都有一個委託隊列,以防止工作量的增加以平衡負載。這已經記錄在MSDN博客上(從並行編程小組開始:http://blogs.msdn.com/b/pfxteam/)。 – Richard 2012-02-13 10:07:54
@Richard - 我懷疑是這樣,但並不想讓事情複雜化 - 總體設計和效果都是一樣的,每個線程和工作的隊列是一個性能增強。 – 2012-02-13 11:50:58
http://penny-arcade.com/comic/2002/07/22 – 2012-02-13 16:59:38
僅供參考,ThreadPool類是.NET的一部分,不屬於C# – 2012-02-13 00:53:48