簡體   English   中英

什么是使用ThreadPool的正確方法?

[英]what's the proper way to use a ThreadPool?

如果我對ThreadPool工作方式的理解是正確的,那么其目的之一就是限制可以在給定時間創建的進程中的工作線程數。 例如,如果將MaxThreads設置為5,然后將QueueUserWorkItem調用30次,則將向ThreadPool發出30個請求,但這些請求中只有5個將由新線程提供服務,而其他25個請求將被添加到隊列中並且隨着先前的請求完成並且現有線程變得可用,一次服務一個。

但是,在下面的代碼中,對Thread.Sleep(-1)的調用保證DoSomething()方法永遠不會返回,這意味着當前線程永遠不會對后續請求可用。

但是我對ThreadPool工作方式的理解不正確,因為如果它是正確的,下面的代碼只打印數字0-4而不是0-29。

有人可以解釋ThreadPool如何工作以及為什么下面的代碼沒有做我認為它應該做的事情?

    static void DoSomething(object n)
    {
        Console.WriteLine(n);
        Thread.Sleep(-1);
    }

    static void Main(string[] args)
    {
        ThreadPool.SetMaxThreads(5, 5);
        for (int x = 0; x < 30; x++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x);
        }
        Console.Read();
    }

ThreadPool.SetMaxThreads(5, 5)

意味着活動線程的數量是5(如果你有超過5個cpu核心),並不意味着ThreadPool只能創建5個線程。 ThreadPool最大線程數= CPU Core * 250。

Thread.Sleep之后,線程處於非活動狀態,因此不會影響其他線程的執行。

但是我對ThreadPool工作方式的理解不正確,因為如果它是正確的,下面的代碼只打印數字0-4而不是0-29。

是的,你的假設是非常正確的。

由於你已經在ThreadPool中排隊了30個作業,並且Jobs將為InfiniteTime休眠,它們永遠不會完成,ThreadPool類將等待一定的時間間隔來創建新線程,但不會超過最大線程數。

注意

Console.Read()使您的后台線程保持活動狀態。

用品

來自MSDN

許多應用程序創建的線程在休眠狀態下花費大量時間,等待事件發生。 其他線程可能僅進入休眠狀態以定期喚醒以輪詢更改或更新狀態信息。 線程池使您可以通過為應用程序提供由系統管理的工作線程池來更有效地使用線程。 一個線程監視排隊到線程池的幾個等待操作的狀態。 當等待操作完成時,來自線程池的工作線程執行相應的回調函數。


當所有線程池線程都已分配給任務時,線程池不會立即開始創建新的空閑線程。 為避免不必要地為線程分配堆棧空間,它會間隔創建新的空閑線程。 該間隔目前是半秒,盡管它可能會在.NET Framework的未來版本中發生變化。


托管線程池中的線程是后台線程。 也就是說,它們的IsBackground屬性是真的。 這意味着在所有前台線程退出后,ThreadPool線程不會保持應用程序運行。

可能是Thread.Sleep(-1)沒有按預期執行。

參數Int32:線程被阻塞的毫秒數。 指定零(0)以指示應該掛起此線程以允許其他等待線程執行。 指定無限以無限期地阻止該線程。

http://msdn.microsoft.com/en-us/library/d00bd51t.aspx

您應該查看任務, http://msdn.microsoft.com/en-us/library/dd235608.aspx將其視為Threadpool 2.0

通常,ThreadPool創建的線程數等於CPU核心數。 創建更多線程沒有必要,因為核心一次只能處理一個線程。 但是,當排隊到ThreadPool的任務執行時間超過0.5秒時,ThreadPool會創建一個額外的線程來處理隊列中的剩余任務。 因此,如果將大量繁重的任務排入ThreadPool,它將創建許多其他線程來模擬多任務並以“並行”方式執行所有任務。 但總執行時間與沒有額外線程的情況相同,而且,甚至更少,因為創建線程的操作非常繁重。 這就是為什么ThreadPool被推薦用於小任務的原因,以避免創建實際上沒有帶來任何優勢的額外線程。

您可以在Albahari的文章中閱讀有關ThreadPool的更多信息。 實際上,他有很多關於線程的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM