1. 與系統資源相關,即線程棧的大小
a) 線程棧默認大小可以通過‘ulimit -s’查看,通常這個值是8M。如果用戶修改了該值,則可以查看’/proc/self/limits’獲取該進程相應的值 (其實是需要考慮線程棧和guard page的size)
b) 在32系統上用戶空間大小爲3G,3 * 1024 / 8 ~= 384
c) 程序其他數據需要佔用一部分內存空間,則384 – 1 = 383; 進程中還包含一個主線程,則 383 – 1 = 382; linuxthreads 還需要一個管理線程, 則382 – 1 = 381
d) 可以通過縮減棧的大小來上調單個進程的最大的線程數。
i. Ulimit –s 設置系統默認的棧大小
ii. 調用 pthread_create 的時候用 pthread_attr_getstacksize 設置一個較小的棧大小
2. Glibc設置相關
a) 老版本的glibc中會通過“/usr/include/bits/local_lim.h ”中的”PTHREAD_THREADS_MAX”控制單個進程中最大的線程數,即使棧再小,線程的個數也不能超過這個限制的值;除非重新編譯glibc;
b) 新版本的glibc, 這個限制作了調整(待研究)