我认为该函数将创建线程,直到资源耗尽,但我运行代码,我没有看到资源耗尽..
DWORD WINAPI CreateThreads(LPVOID param)
{
int n = *(int*)param;
HANDLE* threads = (HANDLE*)malloc(n * sizeof(HANDLE));
for (int i = 0; i < n; i++)
{
threads[i] = CreateThread(NULL,0, CreateThreads, &n, 0,NULL);
}
for (int i = 0; i < n; i++)
{
WaitForSingleObject(threads[i], INFINITE);
}
return 0;
}
int main()
{
int n = 5;
CreateThreads(&n);
return 0;
}
Windows保护自己免受这种类型的疲惫。一旦达到每个进程允许的最大线程数,CreateThread
就会失败(对于我有幸开发的Windows系统,通常大约有2000个线程)
您可能已经预料到某些资源会先耗尽,但是线程需要很多资源,第一个耗尽自身会导致后续调用CreateThread
失败。从我的经验中消耗的主要两个资源是虚拟内存,这是由于每个新线程所需的堆栈,以及内核在调度程序中可以保存的线程数限制(上下文切换机制)。