Windows系统单个进程最多线程数2000个?

在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.”

 

如何突破2000个限制?

可以通过修改CreateThread参数来缩小线程栈StackSize,例如

#define   MAX_THREADS   50000  
   
  DWORD   WINAPI   ThreadProc(   LPVOID   lpParam   ){  
  while(1){  
  Sleep(100000);  
  }  
  return   0;  
  }  
   
  int   main()   {  
          DWORD   dwThreadId[MAX_THREADS];  
          HANDLE   hThread[MAX_THREADS];    
   
  for(int   i   =   0;   i   <   MAX_THREADS;   ++i)
  {  
    hThread[i]  = CreateThread(0,  64, ThreadProc, 0, STACK_SIZE_PARAM_IS_A_RESERVATION,   &dwThreadId[i]);  
    
    if(0   ==   hThread[i])
    {  
     DWORD   e   =   GetLastError();  
     printf("%d\r\n",e);  
     break;  
    }  
  }  
  ThreadProc(0);  
  }   

 

服务器端程序设计

如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:

The "one thread per client" model is well-known not to scale beyond a dozen clients or so. If you're going to be handling more than that many clients simultaneously, you should move to a model where instead of dedicating a thread to a client, you instead allocate an object. (Someday I'll muse on the duality between threads and objects.) Windows provides I/O completion ports and a thread pool to help you convert from a thread-based model to a work-item-based model.

1. Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification
2. Serve many clients with each thread, and use nonblocking I/O and readiness change notification
3. Serve many clients with each server thread, and use asynchronous I/O

posted on 2008-09-23 20:35  Mainz  阅读(3827)  评论(0编辑  收藏  举报

导航