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

本文通过实验探讨了在一个进程中能够创建的最大线程数量,并分析了影响这一数量的因素,包括线程栈大小等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from:

http://blog.youkuaiyun.com/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以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值