实验:一个进程到底能创建多少线程?
2016-12-07 09:15
495 查看
from:
http://blog.csdn.net/zencher/article/details/2784298
在网上看到有朋友讨论,一个进程能创建的线程的最大数量,我学习了一下,做了这个小实验。
理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。怎么设置呆会儿再说。
在VC下写了一个控制台程序,目的很简单,就是创建4500个线程程
代码如下:
#include <windows.h>
#include <process.h>
#include <stdio.h>
HANDLE hProcess;
HANDLE hThread;
DWORD WINAPI athread( void ) //线程函数
{
WaitForSingleObject( hProcess, INFINITE ) ;
return 0 ;
}
bool createThread( int threadNum ) //参数表示创建的线程数
{
int i ;
int iSeccessed = 0;
int iFailed = 0;
hProcess = GetCurrentProcess();
for( i = 0; i < threadNum; i++ )
{
hThread = NULL ;
hThread = (HANDLE)_beginthreadex( NULL, 0, (unsigned int (__stdcall *)(void *))athread, NULL, NULL, NULL ) ;
if( hThread != NULL )
{
printf("/rThe Number of Thread : %d ", i+1 ) ;
///iSeccessed++;
}else{
printf("/nError : Create Thread Fail./n") ;
return false ;
}
}
return true ;
}
int main()
{
printf("Test : How much thread a process can create./n") ;
createThread( 4500 ) ;
getchar();
return 0 ;
}
为了不影响性能,线程不做任何操作,等待进程终止,在进程没有终止之前,,建立好的线程始终被挂起。
默认情况下,在我的机子上,创建到2024个进程时提示错误。
现在来讲如何设置栈的大小。我用的是vc2005。
菜单栏的“项目”->“***属性”,选择“配置属性”下的“链接器”下的“系统”,将堆栈保留大小设置为:524288,这个值就是512KB,这里的单位是字节,所以要自己换算,这样理论上能创建4096个进程。
再次编译,运行,这个时候创建到了4031个线程时失败,大约是原来的两倍,因为主线程要占用一定的内存,这个结果是正常的。
结论是:一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。
http://blog.csdn.net/zencher/article/details/2784298
在网上看到有朋友讨论,一个进程能创建的线程的最大数量,我学习了一下,做了这个小实验。
理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。怎么设置呆会儿再说。
在VC下写了一个控制台程序,目的很简单,就是创建4500个线程程
代码如下:
#include <windows.h>
#include <process.h>
#include <stdio.h>
HANDLE hProcess;
HANDLE hThread;
DWORD WINAPI athread( void ) //线程函数
{
WaitForSingleObject( hProcess, INFINITE ) ;
return 0 ;
}
bool createThread( int threadNum ) //参数表示创建的线程数
{
int i ;
int iSeccessed = 0;
int iFailed = 0;
hProcess = GetCurrentProcess();
for( i = 0; i < threadNum; i++ )
{
hThread = NULL ;
hThread = (HANDLE)_beginthreadex( NULL, 0, (unsigned int (__stdcall *)(void *))athread, NULL, NULL, NULL ) ;
if( hThread != NULL )
{
printf("/rThe Number of Thread : %d ", i+1 ) ;
///iSeccessed++;
}else{
printf("/nError : Create Thread Fail./n") ;
return false ;
}
}
return true ;
}
int main()
{
printf("Test : How much thread a process can create./n") ;
createThread( 4500 ) ;
getchar();
return 0 ;
}
为了不影响性能,线程不做任何操作,等待进程终止,在进程没有终止之前,,建立好的线程始终被挂起。
默认情况下,在我的机子上,创建到2024个进程时提示错误。
现在来讲如何设置栈的大小。我用的是vc2005。
菜单栏的“项目”->“***属性”,选择“配置属性”下的“链接器”下的“系统”,将堆栈保留大小设置为:524288,这个值就是512KB,这里的单位是字节,所以要自己换算,这样理论上能创建4096个进程。
再次编译,运行,这个时候创建到了4031个线程时失败,大约是原来的两倍,因为主线程要占用一定的内存,这个结果是正常的。
结论是:一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。
相关文章推荐
- 实验:一个进程到底能创建多少线程?
- JVM源码分析之一个Java进程究竟能创建多少线程
- 个进程到底能创建多少线程
- 一个进程可以创建多少线程?
- 【深入Java开发】JVM源码分析之一个Java进程究竟能创建多少线程
- JVM源码分析之一个Java进程究竟能创建多少线程
- 实验六:分析Linux内核创建一个新进程的过程
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
- 一个进程(Process)最多可以生成多少个线程(Thread)
- Linux下查看某个进程创建了多少线程
- 实验六———分析Linux内核创建一个新进程的过程
- 同一个进程的线程到底共享了哪些资源?
- “Linux内核分析”实验报告(六)分析Linux内核创建一个新进程的过程
- Linux内核创建一个新进程的实验
- 在linux下查看一个进程它有多少个线程是用什么命令?
- 实验六:分析Linux内核创建一个新进程的过程
- 一个进程最多可以创建线程的数目
- 讨论:一个进程(Process)最多可以生成多少个线程(Thread)
- 一个进程能支程多少个线程
- 一个进程(Process)最多可以生成多少个线程(Thread)