我的c程序无法创建超过8 threads
。它返回错误代码EAGAIN(11)
。这是因为缺乏可用的资源。在发布这个问题之前,我用谷歌搜索了它的解决方案,但无法解决这个问题。以下是我为程序和unix系统找到的详细信息。
我的线程创建功能是: -
thread_initialise(File *CFG_FILE)
{
int total_pthreads; //reads number of threads I want for the program from configuration file.
int rc =0 ;
for (i = 0; i < total_pthreads; i++)
{
rc = pthread_create (&pthread_list[i], NULL, (fp)(begin_worker_pthread), NULL);
if (rc !=0) printf("Thread creation Error Code: %d",rc);
}
}
执行时我的程序占用的内存为:pmap -x <pid> = 1111844
Unix版本:uname -a = Linux 2.6.18-308.24.1.el5 #1 SMP Wed Nov 21 11:42:14 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
unix cat /proc/sys/kernel/threads-max = 81920
ulimit -u max user processes (-u) 16000
ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 40960
max locked memory (kbytes, -l) 3000000
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 5857280
real-time priority (-r) 0
stack size (kbytes, -s) 512000
cpu time (seconds, -t) unlimited
max user processes (-u) 16000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
请帮助我的系统计算/修复最大线程数。我想将我的主题增加到32
。
答案 0 :(得分:2)
从终端设置ulimit -s 4000
。现在你可以运行比以前更多的线程,但是你会在某个阶段遇到分段错误。
线程数=总虚拟内存/(堆栈大小* 1024 * 1024)
每个进程的线程数可以通过增加总数来增加 虚拟内存或减少堆栈大小。但是,减少堆栈大小 由于堆栈溢出而导致代码失败太多会导致代码失败 虚拟内存等于交换内存。
进一步的信息请参阅this帖子清楚解释。
答案 1 :(得分:1)
毕竟上面的R&amp; D我发现我的系统是Maximum number of threads for program = Memory Size(RAM) / Stack Size
。这个计算对我的系统起作用了。
虽然我的虚拟内存设置为无限制,但我不能增加我的线程数量而不是上面的计算。
在sparate问题中,我已经要求程序的最小堆栈大小,以便程序永远不会失败。这是链接:UNIX: What should be Stack Size (ulimit -s) in UNIX?