2015-02-08 89 views
2

我讀Essential C# 5.0它說,我對C#線程池的理解是否正確?

線程池還假定所有的工作會比較 短期運行(也就是,消耗的處理器 時間毫秒或秒,而不是幾小時或幾天) 。通過這樣的假設,它可以確保 每個處理器正在完成一項任務,並且而不是 時間分割多任務。線程池嘗試 通過確保線程創建爲 「節流」並且使得沒有任何一個處理器被太多的線程「過度使用」,從而防止過多的時間分割

我一直認爲多線程的好處之一是時間切片。

如果您> 1處理器,則可以同時運行線程並實現真正的多線程。但除非是這種情況,否則你不得不求助於時間分片來處理多線程的應用程序嗎?

所以,如果在C#中的線程池沒有時間片,然後,

一個。這是否意味着ThreadPool是只有用於解決創建新線程的開銷?

b。這是否意味着ThreadPool不能同時運行多個線程,除非處理器有多個內核,每個內核可以運行一個進程?

+2

否..您的理解不正確.. – EZI 2015-02-08 01:14:44

回答

2

.NET線程池將爲每個內核創建多個線程,但具有啓發式功能,可在執行最大工作量時儘可能降低線程數。

這意味着如果你的代碼是CPU綁定的,你最終可能會得到每個內核的單個線程。如果你的代碼是I/O綁定的並且阻塞了,或者排隊了大量的工作項目,那麼你最終可能會爲每個內核創建許多線程。

這不僅僅是創建線程非常昂貴:數百個線程之間的上下文切換需要很長時間,而您寧可花費大量時間來運行自己的代碼。更多的線程幾乎永遠不會更好。

2

您提到的引用指的是當所有已經創建的線程已經分配給任務時,線程池創建新線程的速率。新的線程創建速率會受到限制(並且新任務將排隊),以避免在Threadpool上放置大量任務時創建多個線程(以及淹沒CPU)。

當前的算法確實爲每個CPU內核創建了許多線程,但是它創建的速度相對較慢,希望當前積壓的任務能夠很快地被已經創建的線程滿足,並且添加線程不會被需要。

0

問:這是否意味着ThreadPool僅用於解決創建新線程的開銷?

A.編號線程創建通常不是問題。目標是讓你的CPU工作在100%,儘可能少地使用盡可能少的併發執行線程。線程數量少可避免過度的上下文切換,並可縮短總體執行時間。

問:這是否意味着ThreadPool不能同時運行多個線程,除非處理器具有多個內核,其中每個內核都可以運行單個進程? A.它同時運行多個線程。理想情況下,每個核心運行一個CPU密集型任務,在這種情況下,CPU的工作速度爲100%