【问题标题】:pthread_create fails w/ ENOMEM?pthread_create 使用 ENOMEM 失败?
【发布时间】:2010-08-27 00:38:23
【问题描述】:

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

我能够创建 16 个可连接线程,但第 17 个和后续调用失败并出现 ENOMEM 错误(这显然意味着内存 - 或 - 某些其他资源不可用)。有什么想法吗?

【问题讨论】:

  • 真的很难说。它应该能够创建比这更多的线程,尤其是在 64 位机器上(你的程序是用 64 位指针编译的吗?),地址空间碎片应该不是问题。您能否 strace -f 程序并发布一段摘录(系统调用前后的几十行,不管它是什么,实际返回的 ENOMEM 就足够了),好吗?
  • 可能是堆栈大小。您是否在创建线程时明确设置它?
  • 不,我使用的是默认堆栈大小(ulimit -s 表示 10240k)codepthread_attr_t threadAttr; pthread_t 线程ID; pthread_attr_init(&threadAttr); pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_JOINABLE); pthread_attr_setscope(&threadAttr, PTHREAD_SCOPE_SYSTEM); int rc = pthread_create(&threadID, &threadAttr, (void*()(void))myTask, myParms); code
  • pl。根据@Zack 的要求添加您的代码和 strace 作为您问题的编辑。

标签: c multithreading pthreads


【解决方案1】:

我在strace下运行程序,看到如下:

mmap(NULL, 10489856, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|0x40, -1, 0) = -1 ENOMEM (无法分配内存)
mmap(NULL, 10489856, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM(无法分配内存)

更新:不要问我为什么,但以下更改解决了这个问题:

pthread_attr_setscope(pattr, PTHREAD_SCOPE_SYSTEM);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果进程中的可用虚拟内存碎片化,pthread_create() 可能会失败:没有足够的空间(没有足够大的“洞”)来分配线程的堆栈,如here 所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        相关资源
        最近更新 更多