【问题标题】:What's the number of threads created by below code and why?下面的代码创建的线程数是多少,为什么?
【发布时间】:2019-08-23 10:44:38
【问题描述】:

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

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

【问题讨论】:

  • 你试过检查CreateThread返回什么?
  • 如果你真的想知道有多少线程被创建,你可以让CreateThreads()在进入时自动增加一个计数器变量,并在退出前自动减少计数器,然后你可以显示当前定期计数器值。

标签: c multithreading winapi


【解决方案1】:

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

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

【讨论】:

  • 如果我删除 WaitForSingleObject,我不会有资源耗尽的情况,对吧?
  • 你可能会让事情变得更糟。现在,您的程序将在达到线程限制后结束。如果您的线程终止而不是等待,则可能会继续创建新的线程。
  • @JavaDeveloper 如果您删除 WaitFor,那么一些线程将完成并且每个线程内的n 超出范围,可能在下一个线程复制它之前。所以如果你这样做,它只会疯狂地崩溃。
  • 再想一想,无需等待,您的主函数将立即退出,程序将终止。尝试在main 中添加长时间睡眠,看看会发生什么。
  • 而且仅供参考,您可以将 WaitForSingleObject() 循环替换为单个 WaitForMultipleObjects() 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多