【问题标题】:What's the maximum number of threads possible for a threads in Windows 8.1?Windows 8.1 中线程的最大线程数是多少?
【发布时间】:2014-08-21 04:09:32
【问题描述】:

Windows 8.1 可以生成的最大线程数是多少,哪些因素会限制线程数?

【问题讨论】:

  • 如果你需要知道这一点,那你就做错了。
  • 实际上是微软提出的问题,选项为 (A)4000, (B)40,000 (C)1000 (D)400。在实习笔试中,所以我没有认为微软是错的
  • 还不错;让我改述一下。如果你需要知道这一点在编程时你做错了。严格来说,我不确定这里的试题是否与主题有关,但 Hans 已经发布了一个很好的答案,所以我就让它溜走。 :-) 审稿人注意:这绝对不是超级用户的问题。
  • e) 没有人在意,只要盒子不经常超载(即准备好的线程多于内核)。

标签: windows multithreading concurrency operating-system


【解决方案1】:

与 Windows 中的大多数限制一样,这受到可用内存的限制。当所有可用的虚拟内存都被线程堆栈(每个 1 MB)占用时,一个 32 位进程的线程数略低于 2000 个。 64 位进程受限于提交分配所需的页面文件的大小。成千上万,这取决于页面文件可以增长多快以满足程序的需求。内核的分页内存池也有一个限制,每个线程都有一个内核堆栈,以便它可以进行内核调用,通常每个线程 24 KB。

这些限制远远超出了程序员可以保持在空中而不会掉到脚上的球的数量。他会跛行很长一段时间,线程错误非常难以解决。

Mark Russinovich 在此 excellent blog post 中探索了限制。

【讨论】:

    【解决方案2】:

    我相信您可能认为这有点错误。线程受您的 CPU 以及内存中可以容纳多少线程的限制,而不是 Windows 操作系统。此外,您攻击并发编程的方式很大程度上取决于您使用的编程语言如何解决问题。例如,使用 stl 库的 c++ 与使用 mpi(基于进程)的 c++ 是非常不同的。

    每个 CPU 都有一个可以一次完成的物理/虚拟线程限制。超过该数量将导致线程超额订阅,从而强制任务切换。例如,我的 PC 有 8 个线程(4 个核心 / 4 个虚拟),如果我创建 10 个线程,我会得到它们,但 2 将永远不会在任何时候运行。这将为机器做额外的任务切换以满足所有 10 个线程。另外,请记住,您的程序并不是 PC 中唯一运行的程序。

    要找到可以使用 stl 在 C++ 中运行的最大线程数:

    #include<iostream>
    #include<thread>
    using namespace std;
    int main()
    {
        cout << thread::hardware_concurrency();
        cin.get();
        return 0;
    }
    

    虽然我建议使用诸如 C# 之类的编程语言,它使用自动线程池和任务为您抽象线程。这将使学习这些概念变得更容易。

    另外,进程和线程是不同的。为了更好地解释这种差异,我建议使用以下链接:

    What is the difference between a process and a thread

    【讨论】:

    • 我的 i7 盒子有 77 个进程和 1255 个线程 ATM。一切都很好。
    • 我的电脑有超过 8 个进程处于活动状态,但一次只能运行 8 个。 windows中的调度器会在线程执行和进程执行之间切换进行补偿,没有问题。
    • 我想说的是“Windows 8.1 中可以生成的最大线程数是多少”与“可以运行的最大线程数是多少”不是同一个问题在 Windows 8.1 中生成'几乎典型桌面系统上的所有线程都已重新准备好或正在运行,但通常在 I/O 或线程间通信上被阻塞。
    【解决方案3】:

    来自微软实习生的问题:

    可能的答案:取决于 RAM 大小和处理器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 2018-09-09
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多