有誰知道嗎?而更大的問題是當你遇到這個最大值時會發生什麼?這與其他Windows操作系統(例如Vista,XP等)的數字相同嗎?Windows Server 2003中線程的最大數量是多少?
回答
首先,我會建議閱讀本: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx
然後http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx
總之,限制是正常的堆棧空間(必須是連續的塊)和因爲每個線程迅速消耗這個散落您用盡連續塊。 在64位機器和操作系統上,這個問題要少得多。
減災戰略存在,但只能走這麼遠(和依靠你不使用每個線程的堆棧)
作爲一個粗略的指南:
- 創造幾十幾乎可以肯定工作
- 在當前的服務器和桌面硬件上可能有數百個可能,但有風險
- 成千上萬的幾乎肯定會失敗。
你可能不應該需要創建十餘反正(如果你真的做需要你應該已經知道這個信息)
林猜測它不是線程的數量,但內存使用率是限制因素。
據我瞭解整個線程模型它應該自Win2K以來沒有多大改變。
線程本身並沒有真正的限制,但更多的是進程棧空間的限制。有關詳細信息,請參閱Raymond Chen的in-depth explanation of threading limits。
賓果! 「但是每當有人問到」進程可以創建的線程的最大數量是多少「時,就會產生真正的問題:」爲什麼創建這麼多的線程,這甚至成爲一個問題?「」 – TheSoftwareJedi 2009-01-27 00:27:07
最好的答案問這樣的問題時,我聽到的是:
不要緊,如果你發現這非常重要,你需要重新考慮自己在做什麼,以便它沒關係。
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的評論。創造了我的一天。當涉及到線程時,它肯定是成立的。 – 2011-08-07 12:22:42
我要在Knights Landing上運行Windows。所以它現在對256-288線程 – user1649948 2016-06-20 22:17:59
請注意,如果您擔心觸及此限制,您應該仔細檢查您的設計!!!!!!!!
發生什麼事情的「更重要的問題」的答案是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()); }
務必閱讀雷蒙德陳博客帖子指出,ShuggyCoUk's answer指出。
但要特別注意這一點:「那是什麼一個進程可以創建的最大線程數」
但這種情況正在提出的真正的問題,每當有人問,是「爲什麼你創造這麼多線程,這甚至成爲一個問題?」
「每個客戶端一個線程」模式是衆所周知的,不會超過十幾個客戶端等。如果你要同時處理多個客戶端,你應該轉向一個模型,而不是將一個線程專用於客戶端,而是分配一個對象。 (有一天我會研究線程和對象之間的雙重性)。Windows提供了I/O完成端口和一個線程池,以幫助您從基於線程的模型轉換爲基於工作項的模型。
如果你堅持使用現有的設計,採用了大量的線程,需要擴展,您也可以考慮纖維:
http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx
它可以節省你完全重新設計。
Indy認爲它適用於Indy 10,但它從來沒有發生過,因爲.NET冒險大部分時間都是消耗的。
問題似乎很老了,但想作爲補充可以是有益他人,以及:
本文有關:推的Windows的限制:進程和線程
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
默認堆棧大小爲1MB,在32位Windows操作系統下分配給Windows進程的用戶模式地址空間大約爲2 GB。每個進程允許大約2000個線程(2000 * 1MB = 2GB)。對於64位來說,實際上不存在這樣的問題。
- 1. Windows併發tcp/ip連接的最大數量是多少?
- 2. UNNotificationActions的最大數量是多少?
- 3. sql server集羣上存儲的最大數據量是多少?
- 4. SQL Server 2008中允許的最大連接數是多少?
- 5. 多查詢中查詢的最大數量是多少?
- 6. windows中每個進程/線程的最大互斥量數
- 7. Loggly的最大吞吐量是多少?
- 8. 我可以在SQL Server行中存儲的最大數據量是多少?
- 9. Microsoft SQL Server 2005和2008中數據庫的最大容量是多少?
- 10. 在Windows中可以使用的RAM的最大數量是多少?
- 11. Hadoop集羣中的最大數據節點數量是多少?
- 12. 主函數中語句的最大數量是多少?
- 13. 在Delphi應用程序中可以運行的最大線程數是多少?
- 14. 最大長度是多少?
- 15. 應用程序中的最佳線程數應該是多少?
- 16. 「session.save_path」中的php會話文件的最大數量是多少
- 17. 設置線程池中的最大線程數少於核心
- 18. 記錄中嵌套記錄的最大數量是多少?
- 19. minizinc中約束的最大數量是多少
- 20. 我可以在Subversion中修改的最大數量是多少?
- 21. MariaDB中表連接的最大數量是多少?
- 22. Couchdb文檔中字段的最大數量是多少?
- 23. 片段着色器中紋理的最大數量是多少
- 24. Cassandra中密鑰空間的最大數量是多少?
- 25. Erlang系統中節點的最大(實際)數量是多少
- 26. 局域網內電腦的最大數量是多少?
- 27. Mercurial&Windows Server 2003
- 28. PHP中單個POST變量的最大大小是多少?
- 29. lucene分數的最大值是多少?
- 30. MemSQL的最大列數是多少?
當內存不碎片化時,儘早創建它們並將它們合併以備後用時也應該有所幫助。 – 2011-08-24 07:38:46