The*_*uad 1 c++ multithreading pthreads
进程运行卡在 32 000 (± 5%) 左右
~# cat /proc/sys/kernel/threads-max 127862
~# ulimit -s 堆栈大小 (kbytes, -s) 2048
可用内存:3,5 Go
此外,当我在进程像“top”一样卡住的情况下尝试基本命令时,我收到 bash 消息:无法分叉,内存不足。即使还有 3,5 Go 的空闲内存。
什么可以限制线程创建在 32 000 ?
小智 6
差不多 10 年后:内核 5.6。kernel/fork.c 中有一个限制:请参阅 max_threads/2。
但罪魁祸首是 mmap。查看strace输出:
mprotect(0x7fbff49ba000, 8388608, PROT_READ|PROT_WRITE) = -1 ENOMEM(无法 > 分配内存)
增加/proc/sys/vm/max_map_count更多线程。
线程用线程 ID (TID) 来标识,在 Linux 中它只是 PID,并且...
~% sysctl kernel.pid_max
kernel.pid_max = 32768
Run Code Online (Sandbox Code Playgroud)
Linux 中的 PID 是 16 位的,32768 已经是允许的最大值。有了这么多线程,您就完全填满了操作系统进程表。我认为您无法创建比这更多的线程。
无论如何,如果您需要那么多线程,那么您的设计确实有问题。真的没有理由拥有这么多。