【发布时间】: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