默認情況下,一個線程的棧要預留1M的內存空間
而一個進程中可用的內存空間只有2G,所以理論上一個進程中最多可以開2048個線程
但是內存當然不可能完全拿來作線程的棧,所以實際數目要比這個值要小。
你也可以通過連接時修改默認棧大小,將其改的比較小,這樣就可以多開一些線程。
如將默認棧的大小改成512K,這樣理論上最多就可以開4096個線程。
即使物理內存再大,一個進程中可以起的線程總要受到2GB這個內存空間的限制。
比方說你的機器裝了64GB物理內存,但每個進程的內存空間還是4GB,其中用戶態可用的還是2GB。
如果是同一台機器內的話,能起多少線程也是受內存限制的。每個線程對象都要站用非頁面內存,而非頁面內存也是有限的,當非頁面內存被耗盡時,也就無法創建線程了。
如果物理內存非常大,同一台機器內可以跑的線程數目的限制值會越來越大。
在Windows下寫個程序,一個進程Fork出2000個左右線程就會異常退出了,為什麼?這個問題的產生是因為windows32位系統,一個進程所能使用的最大虛擬內存為2G,而一個線程的默認線程棧StackSize為1024K(1M),這樣當線程數量逼近2000時,2000*1024K=2G(大約),內存資源就相當於耗盡。如果你的服務器端程序設計成:來一個client連接請求則創建一個線程,那麼就會存在2000個限制(在硬件內存和CPU個數一定的情況下)。