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, 这个限制作了调整(待研究)