pthread_create ENOMEM大约32000个线程

时间:2010-08-05 21:24:54

标签: c++ multithreading pthreads

运行过程遇到大约32 000(±5%)

〜#cat / proc / sys / kernel / threads-max 127862

〜#ulimit -s 堆栈大小(kbytes,-s)2048

可用内存:3,5转

更进一步当我尝试基本命令而进程被卡在“顶部”时,我得到了bash消息:无法分叉,没有足够的内存。 即使仍有3,5 Go的免费记忆。

什么可能限制线程创建在32 000?

2 个答案:

答案 0 :(得分:3)

线程用线程ID(TID)标识,它们只是Linux中的PID,并且......

~% sysctl kernel.pid_max
kernel.pid_max = 32768

Linux中的PID是16位,32768已经是允许的最大值。有了这么多线程,您就完全填满了操作系统进程表。我不认为你能创造更多的线程。

无论如何,如果您需要那么多线程,那么您的设计会出现真的错误。拥有那么多人真的没有理由。

答案 1 :(得分:2)

近10年后:内核5.6。 kernel / fork.c中有一个限制:请参见max_threads / 2。

但是罪魁祸首是地图。参见strace输出:

mprotect(0x7fbff49ba000,8388608,PROT_READ | PROT_WRITE)= -1 ENOMEM(无法>分配内存)

增加/proc/sys/vm/max_map_count以获得更多线程。