【问题标题】:Windows and linux max threadsWindows 和 linux 最大线程数
【发布时间】:2013-08-20 08:19:52
【问题描述】:

Windows 或 Linux 系统可以有多少个线程?

我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。

【问题讨论】:

  • 顺便说一句,我们在这里谈论多少线程?如果您打算拥有少于一打或两打线程,那么您就可以了。无需检查限制。相反,您应该做的只是检查生成线程是否成功。你真的不需要事先知道。
  • 如果您期望接近极限,那么您的设计可能是错误的......
  • @SpongeBobFan:嗯,并非总是如此。如果您的线程正在执行任何阻塞 IO,则 CPU 内核处于空闲状态,等待阻塞 IO 完成。例如,使用异步 IO 将允许操作系统执行不同的线程。
  • 这样的问题应该会自动添加一个指向If you have to ask, you're probably doing something wrong的链接!

标签: c++ linux windows multithreading process


【解决方案1】:

我很确定,如果您真的“需要知道这一点”,那么您的设计就是糟糕的。所有现代操作系统都可以支持数千个线程。

这些限制通常更多地是关于可用内存和 CPU 资源,而不是“你可以在系统 X 中创建多少线程”——换句话说,如果你的线程确实做了一些事情,并且实际上使用的内存不止一点点,那么在创建理论上的最大线程数之前,系统将耗尽内存。

例如,在我的机器上/proc/sys/kernel/threads-max 超过 250000 - 我的机器有 16GB 的内存,所以每个线程大约有 64KB。也就是说,如果所有内存实际上都可用于线程......其中一些将是内核代码、文件系统缓冲区等。

所以实际上,内存将是您的限制,而不是系统可以支持的理论线程数。

【讨论】:

    【解决方案2】:

    对于 Windows,TechNet 有一篇由 Mark Russinovich Pushing the Limits of Windows: Processes and Threads 撰写的文章。该文章还链接到 testlimit 工具,该工具可让您在自己的系统上进行试验。

    TL;DR 版本取决于 Windows 版本,您运行的是 32 位还是 64 位 Windows,以及您的应用程序是 32 位还是 64 位,对于 32 位程序,您是否'将您的程序链接为“大地址感知”(和 /3GB NTLDR option)。它也可能取决于ASLR。这取决于你是使用默认的线程堆栈保留大小,还是调整它。

    在没有 /3GB 开关的 32 位系统上运行的 32 位非大地址感知进程以及默认的 1meg 堆栈保留将被限制为最多 2048 个线程,但您很可能会占用内存在此之前的限制。

    对于具有调整堆栈大小的 64 位进程,您可能会期望使用 2GB 内存达到 40-50k 线程。

    无论如何,如果您甚至接近达到 32 位限制,那么您就是在做错事(TM)。您不希望每个请求都使用带有线程的阻塞 I/O - 查看异步 I/O 和线程池(以及基于它们构建的所有花哨的抽象)。

    【讨论】:

      【解决方案3】:

      Linux,很简单。 cat /proc/sys/kernel/threads-max

      Windows,更少。基本上这取决于你有多少内存/你在每个线程的堆栈上分配了多少 - 请参阅What's the maximum number of threads in Windows Server 2003?;但基本上

      【讨论】:

      • /proc/sys/kernel/threads-max 是全局线程限制,不能被视为每个进程的限制。例如,如果它说 20000 并且当前全球有 19999 个线程,则您的进程根本无法生成除主线程之外的任何线程。
      • @NikosC。是的,但他确实特别询问了系统限制。
      • @MartinJames 一个公平的观点,引用的链接来自 2009 年,基本观点是(实际的)线程数比其他任何东西都受到内存限制。
      猜你喜欢
      • 2020-11-02
      • 2016-09-14
      • 2011-08-03
      • 2011-03-09
      • 1970-01-01
      • 2020-11-28
      • 2016-03-30
      • 2011-04-20
      相关资源
      最近更新 更多