一个历程能否打开的最大句柄数量,是多少

一个进程能否打开的最大句柄数量,是多少?
这个和windows是32位还是64位有关吗?

是不是在注册表里面能够设置这个上限? 或者在代码里面设置或者调整这个上限?

------解决方案--------------------
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程

  但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。

  你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。

  如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。

  即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。

  比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。

  如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。

  如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。

  在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?

  这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

  MSDN原文:

  “The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.”
------解决方案--------------------
句柄分几种吧
1. 普通的HANDLE, 如文件, 进程等, 这个是每个进程独立的, 使用句柄表HANDLE_TABLE, 不同系统限制不一样, 如 2003 上可以有16M个, 老的系统可能少, 新的系统可能多...
2. GDI的句柄, 这个是所有进程共用一张表, 系统能支持的数量是 0x4000个  16K个 (GDI_TABLE_ENTRY, 新系统可能改变)

这些限制没法调整, 正常来说, 这些数量足够使用, 开太多句柄, 系统的内核其实也会占用太多内存, 看你具体需要什么东西?
------解决方案--------------------
句柄数量是有限的,所以要合理管理句柄
------解决方案--------------------
引用:
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程

  但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。

  你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。

  如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。

  即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。

  比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。

  如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。

  如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。

  在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?

  这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

  MSDN原文:

  “The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.”

VS栈默认1M大小,为何改成512K反而能开更多的线程,兄台是测试过的吗?