首页 > 解决方案 > 下面的代码创建的线程数是多少,为什么?

问题描述

我认为该函数将创建线程,直到资源耗尽,但我运行代码并没有看到资源耗尽..

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;
}

标签: cmultithreadingwinapi

解决方案


Windows 保护自己免受这种类型的耗尽。CreateThread一旦达到每个进程允许的最大线程数,就会失败(对于我有幸开发的 Windows 系统,通常大约有 2000 个线程)

您可能期望首先耗尽某些资源,但是线程需要的资源很多,而第一个耗尽自身的资源会导致后续调用CreateThread失败。根据我的经验,主要消耗的两个资源是虚拟内存,因为每个新线程都需要堆栈,以及内核可以在调度程序中容纳的线程数量的限制(上下文切换机制)。


推荐阅读