下面代码创建的线程数是多少?为什么?

问题描述 投票:-3回答:1

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

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;
}
c multithreading winapi
1个回答
4
投票

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

您可能已经预料到某些资源会先耗尽,但是线程需要很多资源,第一个耗尽自身会导致后续调用CreateThread失败。从我的经验中消耗的主要两个资源是虚拟内存,这是由于每个新线程所需的堆栈,以及内核在调度程序中可以保存的线程数限制(上下文切换机制)。

© www.soinside.com 2019 - 2024. All rights reserved.