2009-01-27 36 views

回答

32

首先,我會建議閱讀本: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

然後http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

總之,限制是正常的堆棧空間(必須是連續的塊)和因爲每個線程迅速消耗這個散落您用盡連續塊。 在64位機器和操作系統上,這個問題要少得多。

減災戰略存在,但只能走這麼遠(和依靠你不使用每個線程的堆棧)

作爲一個粗略的指南:

  • 創造幾十幾乎可以肯定工作
  • 在當前的服務器和桌面硬件上可能有數百個可能,但有風險
  • 成千上萬的幾乎肯定會失敗。

你可能不應該需要創建十餘反正(如果你真的需要你應該已經知道這個信息)

+0

當內存不碎片化時,儘早創建它們並將它們合併以備後用時也應該有所幫助。 – 2011-08-24 07:38:46

0

林猜測它不是線程的數量,但內存使用率是限制因素。

1

據我瞭解整個線程模型它應該自Win2K以來沒有多大改變。

線程本身並沒有真正的限制,但更多的是進程棧空間的限制。有關詳細信息,請參閱Raymond Chen的in-depth explanation of threading limits

+0

賓果! 「但是每當有人問到」進程可以創建的線程的最大數量是多少「時,就會產生真正的問題:」爲什麼創建這麼多的線程,這甚至成爲一個問題?「」 – TheSoftwareJedi 2009-01-27 00:27:07

21

最好的答案問這樣的問題時,我聽到的是:

不要緊,如果你發現這非常重要,你需要重新考慮自己在做什麼,以便它沒關係。

+5

Bravo,線程當有數百個小小的bug gers floating floating become become become become become become become become become become become become become become使用線程池,您不必擔心。 – paxdiablo 2009-01-27 00:29:13

+1

+1的評論。創造了我的一天。當涉及到線程時,它肯定是成立的。 – 2011-08-07 12:22:42

+0

我要在Knights Landing上運行Windows。所以它現在對256-288線程 – user1649948 2016-06-20 22:17:59

12

請注意,如果您擔心觸及此限制,您應該仔細檢查您的設計!!!!!!!!

發生什麼事情的「更重要的問題」的答案是OutOfMemoryException。

不完全是一個直接的答案,但這裏有一些代碼來找出限制。它可能是可用的內存依賴。對查看其他OS/cpu/mem結果感興趣。

隨意編輯和添加您的機器:

  • 的Windows 7,VS2008,雙核,2GB MEM:1465然後用OutOfMemoryException異常崩潰

    int i = 0; 
        try 
        { 
         while (true) 
         { 
          new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start(); 
          i++; 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(i); 
         Console.WriteLine(ex.ToString()); 
        } 
    
1

務必閱讀雷蒙德陳博客帖子指出,ShuggyCoUk's answer指出。

但要特別注意這一點:「那是什麼一個進程可以創建的最大線程數」

但這種情況正在提出的真正的問題,每當有人問,是「爲什麼你創造這麼多線程,這甚至成爲一個問題?」

「每個客戶端一個線程」模式是衆所周知的,不會超過十幾個客戶端等。如果你要同時處理多個客戶端,你應該轉向一個模型,而不是將一個線程專用於客戶端,而是分配一個對象。 (有一天我會研究線程和對象之間的雙重性)。Windows提供了I/O完成端口和一個線程池,以幫助您從基於線程的模型轉換爲基於工作項的模型。

0

默認堆棧大小爲1MB,在32位Windows操作系統下分配給Windows進程的用戶模式地址空間大約爲2 GB。每個進程允許大約2000個線程(2000 * 1MB = 2GB)。對於64位來說,實際上不存在這樣的問題。

相關問題