一个进程 最多能开多少线程

2020-09-1810:11:38 评论 1,178 views

以下内容来源各位网友:

1、狮子没张口

一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。
当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。

https://zhidao.baidu.com/question/1886149780562301708.html

2、yyxayz

在x86平台32位系统,系统占用2GB地址空间,用户方式2GB。如果使用VS,链接程序开关/SACK 或者/F可以设置线程堆栈大小,默认分配一个线程的堆栈大小是1MB,当CreateThread参数的StackSize大小与链接程序设置的不一致时,采用的方法是谁大用谁的,所以用4KB修改当然不会有改变!理论上最大线程数=2GB/1MB=2048。
实际上这个用户方式的2GB并不会全部用作线程堆栈。首先程序的代码和数据、进程环境块、线程环境块、空指针区域等等也需要占用一定的地址空间;再者2GB只是虚拟内存,如果非分页内存被用完,就无法再创建线程,这个与特定机器有关,所以不同机器上做最大线程数测试得到的数字可能不一样。
默认每线程1MB堆栈的话,只能开2048线程(如果你的其它系统资源足够的话)。要想开更多线程,只能修改每个线程的堆栈,但实际中是不推荐这样做的,因为如果你的线程因为一些工作因为线程堆栈不够的话,会导致整个进程崩溃.修改堆栈的方法好像只在XP或以上系统有效,windows 2000中不支持。

https://www.cnblogs.com/yyxayz/p/4139158.html

3、BuguTian

一个进程最多可以产生多少线程,可用如下的方法:
  32位linux系统最大内存地址4G,0-3GB的给用户进程(User Space)使用,3-4GB给内核使用
  stack size (kbytes,-s)10240表示线程堆栈大小,3G/10M=最大线程数,
  但实际会比这个数小一点,因为程序本身占内存,还有些管理线程,
  可以使用ulimit -s来设置stack size,设置的小一点开辟的线程就多。
同时:

  /usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了进程的最大线程数
  /proc/sys/kernel/threads-max中限制了系统的最大线程数

查看公司的服务器:
限制数为: 2^19
实际测试结果:2^16

https://www.cnblogs.com/bugutian/p/9722240.html

历史上的今天
9 月
18

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: