c - 下面的代码创建了多少线程,为什么?

标签 c multithreading winapi

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

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 会保护自己免受此类耗尽的影响。一旦达到每个进程允许的最大线程数(对于我有幸进行开发的 Windows 系统,通常约为 2000 个线程),CreateThread 就会失败

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

关于c - 下面的代码创建了多少线程,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55469151/

相关文章:

multithreading - 使用 OpenMP 的无用 printf 无法加速

c++ - 从字符串到 GUID 的转换失败

c - NtFsControlFile 在压缩时似乎无法处理 < 728 字节的文件

c - 当不在 main 内部工作时

c - linux终端使用printk打印数据

c - C 中 NULL 与 0 有何不同?

java - 是否有原因导致线程仅在我强制调试时才执行?

c - volatile 整数与计算机安全

c - 到底是什么打破了 main 中的 while 循环?

c - 多线程访问数据结构