2009-12-22 144 views
11

是否可以通过任何方式更改进程可以创建的pthread数限制? 目前在我的linux系统上,我可以创建大约380个线程,但是我想增加一点,只要内存可用即可。更改应用程序的最大线程数限制

+2

有趣的......你有没有考虑一些这样的含义系统设计?想到单点故障(SPOF)。 – jldupont 2009-12-22 15:53:51

+0

我不是专家,但我敢打赌,拥有超过380个线程将会通过上下文切换压倒你的处理器。线程的上下文切换小于单独的进程,但是你仍然需要保存程序计数器和寄存器文件,或许还有一些我忘记的东西。你认为你需要多少个线程?我建议分析你的应用程序来确定10个线程与100个线程的线程开销,然后尝试推断出你的目标线程数。你可能会发现它最终不值得付出努力。或者,也许我错了...... – 2009-12-22 16:02:28

+0

我几乎不会在任何地方使用它......但我需要它进行一些实验吗? – Sukanto 2009-12-22 16:16:01

回答

1

看看这个:

Maximum number of threads per process in Linux?

,并采取看看这个,因为它可能涉及到你的问题:

Serve one client with each server thread

+0

'猫吗?/proc/sys/kernel/threads-max'显示'16384',但是我不能创建超过380个pthreads,我甚至尝试过把一个空白函数作为线程的主体 – Sukanto 2009-12-22 16:34:52

+0

你会得到什么错误? – 2009-12-22 17:07:20

+0

在380个线程之后我得到'EAGAIN'作为'pthread_create()'的返回值,它根据'pthread_create()'手册页是'系统缺乏必要的资源来创建另一个线程,或系统施加的限制进程{PTHREAD_THREADS_MAX}中的线程总数将被超出。“ – Sukanto 2009-12-23 08:29:41

3

您的问题是你有没有叫pthread_detach上有问题的线程。这告诉pthread,当线程终止时,与每个线程关联的资源将被释放。您必须在所有线程上调用pthread_join或pthread_release来释放线程资源。这意味着您还必须在您的pthread_join取消处理程序或泄漏中调用pthread_detach。

6

减少用户堆栈大小'ulimit -s 1024';

default: 8MB 
reduced: 1MB 

增加线程数。

设置堆栈大小:pthread_attr_setstacksize(1024)