我看到pthread_create()在rc = 12(ENOMEM)时失败,在具有4GB实内存的64位RHEL机器上。 'top'命令显示当线程创建失败时,进程正在使用1G的虚拟内存。
我能够创建16个可连接线程,但第17次和后续调用因ENOMEM错误而失败(这显然意味着内存 - 或者其他一些资源不可用)。对于出了什么问题的任何想法?
答案 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所述。