实验:一个进程到底能创建多少线程?

 

        在网上看到有朋友讨论,一个进程能创建的线程的最大数量,我学习了一下,做了这个小实验。

        理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。怎么设置呆会儿再说。

 

        在VC下写了一个控制台程序,目的很简单,就是创建4500个线程程

        代码如下:

 

  1. #include 
  2. #include 
  3. #include 
  4. HANDLE hProcess ;
  5. HANDLE hThread ;
  6. < /li>
  7. DWORD WINAPI athread( void )    //线程函数
  8. {
  9.     WaitForSingleObject( hProcess, INFINITE ) ; 
  10.     return 0 ;
  11. }
  12. bool createThread( int threadNum )    //参数表示创建的线程数
  13. {
  14.     int i ;
  15.     hProcess =  GetCurrentProcess();
  16.     for( i = 0; i < threadNum; i++ )
  17.     {
  18.         hThread = NULL ;
  19.         hThread = (HANDLE)_beginthreadex( NULL, 0, (unsigned int (__stdcall *)(void *))athread, NULL, NULL, NULL ) ;
  20.         if( hThread != NULL )
  21.         {
  22.             printf("/rThe Number of Thread : %d ", i+1 ) ;
  23.         }else{
  24.             printf("/nError : Create Thread Fail./n") ;
  25.             return false ;
  26.         }
  27.     }
  28.     return true ;
  29. }
  30. int main()
  31. {
  32.         printf("Test : How much thread a process can create./n") ;
  33.         createThread( 4500 ) ;
  34.         getchar();
  35.         return 0 ;
  36. }

为了不影响性能,线程不做任何操作,等待进程终止,在进程没有终止之前,,建立好的线程始终被挂起。

 

 

 

 

 

默认情况下,在我的机子上,创建到2024个进程时提示错误。

 

现在来讲如何设置栈的大小。我用的是vc2005。

菜单栏的“项目”->“***属性”,选择“配置属性”下的“链接器”下的“系统”,将堆栈保留大小设置为:524288,这个值就是512KB,这里的单位是字节,所以要自己换算,这样理论上能创建4096个进程。

 

再次编译,运行,这个时候创建到了4031个线程时失败,大约是原来的两倍,因为主线程要占用一定的内存,这个结果是正常的。

 

结论是:一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。

 

 

你可能感兴趣的:(Windows原理和实践)