2010-01-11 67 views

回答

0

线程堆栈大小是可配置的,使用pthread_attr_setstack方法。线程数量仅限于您拥有的资源,超过2K个线程在我所知道的应用程序中工作。

3

的最大线程数:Maximum number of threads per process in Linux?

堆栈大小:

即使现在提供pthread_attr_setstacksize()和pthread_attr_setstackaddr(),我们还是建议您不要使用它们,除非你真的有很强的这样做的理由。 LinuxThreads的默认堆栈分配策略几乎是最优的:堆栈启动很小(4k),并按需自动增长到相当大的限制(2M)。而且,没有便捷的方法来估计线程的堆栈需求,所以自己设置堆栈大小会使程序不可靠和不可移植。

(从http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html

+1

LinuxThreads在将近7年的时间里没有任何Linux发行版。特别是,自RHEL3以来,RHEL并未发布LinuxThreads。 – 2010-01-11 15:00:16

+0

@Jörg。同意。我找不到更好的文档。你有链接吗? – 2010-01-11 16:07:41

1

没有通过的进程线程的最大数目。

然而,总活动线程有限制。这个值可以通过键入检索:

cat /proc/sys/kernel/threads-max 

你也可以改变这个值:

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

希望这有助于。

1

如果你使用的是32位机器,那么线程堆栈最终将占用地址空间,具体取决于大小,可能在< 10,000个线程中。

10k线程肯定是可行的,有些人确实运行了那么多的生产服务器,但是您确实希望确保这是做您的工作的最佳方式。

如果您正在考虑拥有10k线程,那么您可能拥有64位机器以及大量内存。

+0

x86上的默认线程堆栈大小为4KiBytes。使用4G/4G拆分内核配置,理论上可以启动2 ** 20个线程(超过100万)。当NPTL首次发布时,作者实际上运行了该测试,并且它们的最大值出现在900000以下。您可以轻松启动100000个线程(大约需要2秒),系统仍然可用(与LinuxThreads不同,在线程启动100000个线程需要超过15分钟,并使系统停下来)。 – 2010-01-11 14:59:42

+0

我正在设计大多数应用程序需要比4k堆栈多得多的假设。 – MarkR 2010-01-11 17:01:32

+0

这是不正确的,Jörg。在i686上,glibc将为每个线程预留10M的地址空间。很明显,这些内存都没有被分配,但是它占用了大量的可用映射空间,并且只会在几百个线程之后耗尽。启动100k个线程需要调整堆栈大小参数。我怀疑你只是在考虑内核,而不是pthread的glibc实现。 – 2010-01-11 19:52:27