pthread_create失败w / ENOMEM?

时间:2010-08-27 00:38:24

标签: c multithreading pthreads

我看到pthread_create()在rc = 12(ENOMEM)时失败,在具有4GB实内存的64位RHEL机器上。 'top'命令显示当线程创建失败时,进程正在使用1G的虚拟内存。

我能够创建16个可连接线程,但第17次和后续调用因ENOMEM错误而失败(这显然意味着内存 - 或者其他一些资源不可用)。对于出了什么问题的任何想法?

3 个答案:

答案 0 :(得分:1)

我在strace下运行该程序并看到以下内容:

mmap(NULL, 10489856, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|0x40, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 10489856, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)

更新:不要问我原因,但以下更改解决了问题:

pthread_attr_setscope(pattr, PTHREAD_SCOPE_SYSTEM);

答案 1 :(得分:0)

我找到了this。似乎是一个系统限制,但我不完全确定。但是,该站点提供了一种解决方法。

答案 2 :(得分:0)

如果进程中的可用虚拟内存碎片化,

pthread_create()可能会失败:没有足够的空间(没有足够大的“空洞”)来分配线程的堆栈,如here所述。