【问题标题】:What is the maximum number of threads a process can have in windows一个进程在windows中可以拥有的最大线程数是多少
【发布时间】:2018-12-24 10:51:38
【问题描述】:

在 Windows 进程中,一次使用的线程是否有任何限制。如果是这样,每个进程可以使用的最大线程数是多少?

【问题讨论】:

  • 你试过google.de/…了吗?
  • 我对此进行了测试。我的 64 位 Vista 终极版拒绝创建超过 7000 个线程,不记得确切的数字。
  • 这不仅仅是一个“真正的问题”,而是一个有价值的问题。限制不是 16 或 32 或一些无用的小数字并不是很明显。此外,它一点也不“难以说出这里要问什么”,也不存在模棱两可、含糊不清等。我希望结束这些问题的人能多一点反映问题可能为他人提供的价值,他们不提供给自己。这个问题问的正是我想知道的,答案非常有帮助。我们应该怎么知道它——通过 ESP?经验?

标签: c++ multithreading


【解决方案1】:

据我所知没有限制,但有两个实际限制:

  1. 堆栈的虚拟空间。例如,在 32 位中,进程的虚拟空间为 4GB,但只有大约 2G 可用于一般用途。默认情况下,每个线程会保留 1MB 的堆栈空间,因此最高值为 2000 个线程。当然,您可以更改堆栈的大小并使其更小,以便容纳更多线程(CreateThread 中的参数dwStackSize 或链接器命令中的选项/STACK)。如果您使用 64 位系统,此限制实际上会消失。
  2. 调度程序开销。一旦你读取了数千个线程,仅仅调度它们就会消耗你近 100% 的 CPU 时间,所以无论如何它们大多是无用的。这不是硬性限制,只是您创建的线程越多,您的程序就会越慢。

【讨论】:

  • 嗯,取决于线程状态。 6000个阻塞线程对我机器的运行影响为零。此外,即使线程已准备好/正在运行,我也看不出如何,如果我有 16 个线程或 1600 个线程,这将很重要——无论哪种情况,我的 4/8 个内核都会被最大化。
  • @MartinJames:因为内核调度程序用来决定下一步运行什么的算法会随着线程表的大小而变化。毫无疑问,细节因 Windows 版本而异,但我记得在 WinXP 中创建了 2000 个线程,仅使用for(;;) Sleep(1000),CPU 使用率超过 80%。
  • IIRC,readdt 线程结构基本上是线程信息块指针队列的优先级排序数组。如果一个队列有 2000 个条目但只有四个内核,则在计时器中断上穿梭线程只需要将“旧”四个线程推到后面并从前面弹出四个“新”线程 - 并不重要排队很长。这不会需要很长时间吗?
  • ..但是,没有用现成的线程尝试过。我会尝试这样做:)
  • IIRC 也没有尝试使用“睡眠 1000”循环。再次 - 将在我的 Vista 64 上尝试。
【解决方案2】:

实际限制由各种方式的可用内存量决定。在 Windows 中,“你不能拥有超过这个数量”的线程或进程没有限制,但是你可以在系统中使用多少内存是有限制的,当内存用完时,你就无法创建更多线程。

查看 Mark Russinovich 的博客: http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
相关资源
最近更新 更多