當我使用使用ThreadPool的.Net 4 Task類時,如果所有線程都忙,會發生什麼情況?使用任務時如果ThreadPool處於滿/忙狀態,會發生什麼情況?
TaskScheduler是否創建一個新線程並擴展ThreadPool線程的最大數目或者是否等待線程可用?
當我使用使用ThreadPool的.Net 4 Task類時,如果所有線程都忙,會發生什麼情況?使用任務時如果ThreadPool處於滿/忙狀態,會發生什麼情況?
TaskScheduler是否創建一個新線程並擴展ThreadPool線程的最大數目或者是否等待線程可用?
在.NET4.0 32位系統上,ThreadPool中的最大線程數設置爲大約1000個線程。對於較舊版本的.NET來說,這是較少的。如果你有1000個線程正在進行,說他們因爲某種原因阻塞了,當你排隊1001st任務時,它永遠不會執行。
您將永遠不會在32位進程中達到最大線程數。請記住,每個線程至少需要1MB內存(即用戶模式堆棧的大小)以及其他開銷。您已經從CLR和本機DLL中加載了很多內存,因此在使用多個線程之前,您會遇到OutOfMemoryException。
通過調用ThreadPool.SetMaxThreads
方法,可以更改ThreadPool可以使用的線程數。但是,如果您期望使用這麼多的線程,那麼您的代碼會出現更大的問題。我做不是建議你搞亂像ThreadPool配置。你很可能會變得更糟糕的表現。
請注意Task
和ThreadPool.QueueUserWorkItem
,線程在完成時會被重新使用。如果您創建任務或隊列線程池線程,它可能可能或可能不會創建一個新的線程來執行您的代碼。如果池中已有可用的線程,它將重新使用其中的一個,而不是創建(昂貴的)新線程。只有當你在任務中執行的方法永遠不會返回時,如果你擔心線程耗盡,但正如我所說的那樣,這與代碼完全不同。
默認情況下,ThreadPool的MaxThreads非常高。通常你永遠不會到達那裏,你的應用會首先崩潰。
因此,當所有線程都忙時,新任務排隊並緩慢排隊,每500毫秒最多1個,TP將分配新線程。
任何方式來大致瞭解MaxThreads屬性是什麼? – Jon 2012-03-13 16:55:19
您調用[ThreadPool.GetMaxThreads方法](http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads%28v=vs.100%29.aspx) – 2012-03-13 16:57:14
它不會增加MaxThreads。當有更多的任務比可用的工作線程多時,一些任務將排隊並等待直到線程池提供可用的線程。它有一些相當先進的東西來擴展大量內核(工作竊取,線程注入等)。
它不會增加MaxThreads。它絕對可以做一些新的線程 – 2012-03-13 16:58:06
吶,澄清。謝謝。 – 2012-03-13 17:04:12
我假設如果其中一個線程取消了 – Jon 2012-03-13 17:03:24
@Jon,那麼1001st線程將被排隊並執行,這是正確的。那麼,在一個32位系統上,如果沒有內存不足,你不可能執行1000個線程,但是,假設沒有發生,那麼線程最終將在線程釋放時運行。 – 2012-03-13 17:05:29
+1有關每個線程的內存使用情況的詳細信息 – 2012-03-13 17:07:39