注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

widebright的个人空间

// 编程和生活

 
 
 

日志

 
 

windows 7 CreateThread创建线程个数限制  

2014-07-28 15:26:51|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
程序采用CreateThread 函数创建线程
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx

createthread函数失败,调用 GetLastError获取错误,是内存不足。
根据msdn的说明,这个线程个数只受可用内存限制。还有系统默认stacksize的大小有关。系统默认的stacksize是1M,所以32位系统最多可以创建2G/1M  = 2000个左右的线程。  这个默认stacksize 是程序编译时的linker选项指定。
CreateThread函数 dwStackSize  参数指定了这个线程的栈的大小,0就采用系统默认1M的大小。

注意的一点是进程的stack 占用的虚拟空间大小,在任务管理器里面看不出来。需要使用vmmap工具查看才行。所以看起来任务管理器里面内存占用还是很少,但Createthread就失败了,有点奇怪。
windows 7 CreateThread创建线程个数限制 - widebright - widebright的个人空间
 

写个检查的测试程序:

DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
)
{
Sleep(1000000);
return 0;
}

int main(int, char**)
{
DWORD ThreadId;
for (int num = 0; num < 10000; num++) {
HANDLE _thread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &ThreadId);
if (_thread == NULL) break;
std::cout << num << std::endl;
}

int ddd;
cin >> ddd;
return ddd;
}

windows 7 64位机器上面测试
32位程序,大概能创建1500个线程。(2G的用户空间,还是需要用作其他用途的,如果其他部分占用了比较多的内存,可以创建的就更少了)。
64位程序,可以创建1万个线程左右。
其实程序不应该建立这么多的线程的,跟cpu个数一样多就好了吧。这个出问题的程序是采用第3方的库,采用每个http连接一个线程的方式,很是不好的做法。
  评论这张
 
阅读(488)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017