Windows 7 createthread创建线程个数限制

July 28, 2014 | 0 Minute Read

程序采用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连接一个线程的方式,很是不好的做法。