linux - 如何找到一个系统产生的最大线程数?

标签 linux multithreading

有没有一种方法/程序可以找出系统可以产生的最大线程数?我正在创建一个应用程序,我在是否使用事件循环模型或多线程模型方面处于两难境地。所以想要测试系统功能,了解它可以处理多少线程?

最佳答案

“最大线程数”并不像您想象的那样有用:

  • 操作系统或可用硬件资源通常会限制系统范围内的最大线程数。

  • 每个进程的最大线程数通常是可配置的,甚至可以即时更改。

  • 在大多数情况下,实际限制来自您的硬件资源,而不是任何强加的限制。与任何其他资源(例如内存)非常相似,您必须检查您是否成功,而不是依赖某种限制。

一般而言,与事件循环相比,多线程只有两个优势:

  • 它可以使用多个处理器。根据操作系统的不同,您还可以使用多个进程(而不是更轻量级的线程)来执行此操作。

  • 根据操作系统的不同,它可能会提供某种程度的权限分离。

除此之外,多线程通常在内存和处理资源方面都更加昂贵。大量线程会使您的系统停止运行,无论它们正在做的事情是否是资源密集型的。

在大多数情况下,最好的解决方案是两种模型的混合,即多个线程在每个线程中都有一个事件循环。

编辑:

在现代 Linux 系统上,/proc/sys/kernel/threads-max 文件为线程数提供了系统范围的限制。 root 用户可以根据需要更改该值:

echo 100000 >/proc/sys/kernel/threads-max

据我所知,内核并没有明确地对每个进程的线程数施加限制。

sysconf()可用于查询系统限制。 /usr/include/bits/confname.h 中定义了一些半文档化的线程相关查询变量(_SC_THREAD* 变量)。

getrlimit()可用于查询每个 session 的限制 - 在这种情况下,RLIMIT_NPROC 资源与线程相关。

glibc 中的线程实现也可能对每个进程施加其自身的限制。

请记住,根据您的硬件和软件配置,这些限制可能都没有用。在 Linux 上,线程数量的一个主要限制因素是每个线程都需要堆栈中的内存 - 如果您开始启动线程,您很容易在其他任何线程之前遇到这个限制。

如果你真的想找到实际的限制,那么唯一的方法就是开始启动线程,直到你不能再这样做为止。即使这样也只会给您一个粗略的限制,该限制仅在您运行程序时有效。如果例如,它可以很容易地改变。您的线程开始执行实际工作并增加它们的资源使用量。

在我看来,如果你是launching more than 3-4 threads per processor你应该重新考虑你的design .

关于linux - 如何找到一个系统产生的最大线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591772/

相关文章:

使用 CyclicBarrier 的 Java 循环线程

android - 在两次抽奖之间暂停

java - Spring 线程中断

linux - sed 两个模式搜索并在第二个模式的最后一次出现后追加行

c++ - 我是否需要在多线程环境中保护对 STL 容器的读取访问?

由于区域设置,Python 测试在 Gentoo 上通过而在 Ubuntu 上失败?

linux - 仅第一次在 shell 中执行特定命令

c# - 如何用Thread移动PictureBox?

c - FIN-PSH-ACK 服务器端关闭引发来自客户端的 RST

linux - 如何强制内核重新读取/重新初始化 PCI 设备 ID?