【发布时间】:2026-01-11 14:35:01
【问题描述】:
我正在用 C 语言编写一些东西,在 256Mb 系统上的 Linux 中创建大量 Pthread。我通常有 +200Mb 的免费空间。
当我使用少量线程运行程序时,它可以工作,但是一旦我让它创建大约 100 个线程,它就会出现错误,因为系统内存不足。我做了几个测试,每个线程都使用了将近 2Mb。线程的堆栈大小设置为 16Kb。
我用来创建每个线程的代码:
pthread_attr_t attr;
pthread_attr_init(&attr);
size_t stacksize;
stacksize = (double) 16*1024;
int res = pthread_attr_setstacksize (&attr, stacksize);
int res2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (res != 0 || res2 != 0) {
logs << "pthread_attr_XX: error "+int2string(res);
exit(-1);
}
pthread_t id;
pthread_create(&id, &attr, &Class::thread_callback, &some_var);
这是正常的还是我错过了什么?谢谢。
【问题讨论】:
-
您确定您的系统内存不足,还是您的其他资源(可能是线程描述符)不足?
-
@mah:线程描述符在 Linux 中不太可能出现,因为在幕后,它们就像大多数事情的完整进程一样被处理并从进程 ID 池中获取,直到用完为止。更有可能是内存问题是由堆上创建的东西和堆空间耗尽引起的。
-
线程在做什么?您可能需要重新考虑在内存资源如此有限的机器上生成 100 个线程的设计。也许看看
select()。 -
@mah,是的,我可以在其他终端中看到使用的内存增加直到用完。
-
是否使用了 TLS(带有
__thread说明符的数组)?这也可以来自图书馆。您的线程使用 malloc 的大量内存吗? res中真的没有返回错误吗?你的值正好是最大的禁止值according to line 74 of this file。检查是“/* Catch invalid sizes. */\nif (stacksize < PTHREAD_STACK_MIN)\nreturn EINVAL;”
标签: c linux multithreading pthreads memory-efficient