Pthreads - 内存不足?

时间:2011-04-07 17:43:41

标签: c linux unix pthreads stack-overflow

我正在用C语言编写一些在Linux中创建大量Pthread的东西。

当我使用少量线程运行程序时,它可以工作,但是一旦我创建了大约1000个线程,它就会产生错误。现在设置了errno标志,但我想知道导致它的哪个问题。 EAGAINEINVALELEMULTITHREADFORKENOMEM

有什么方法可以找出是否是这些错误之一,如果是,那是哪一个?

3 个答案:

答案 0 :(得分:8)

我相信您正在寻找的是pthread_attr_setstacksize功能。默认情况下,glibc为每个线程的堆栈保留2MB,8MB或10MB或内存。按照这个速度,您将很快耗尽32位计算机上的虚拟地址空间,即使在64位计算机上也会快速耗尽提交费用。

pthread_t td;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 32768);
pthread_create(&td, &attr, start_function, start_art);
pthread_attr_destroy(&attr);

此代码过于简化;当然,你可能想要检查一些这些电话的失败。实际上这就是你最初的问题。 pthread_*函数几乎所有都将错误代码作为返回值而不是errno返回,因此errno不能用于检查结果,{{1除非您将返回值分配给perror,否则将无效。相反,做一些像:

errno

答案 1 :(得分:2)

perror()应该可以解决问题。

在你的linux系统上做man 3 perror

答案 2 :(得分:1)

只是为了俗气的测试:

int ret;
pthread_t tid;

if ((ret = pthread_create(&tid, NULL, startfunc, NULL)) != 0)
{
    errno = ret;
    perror("pthread_create");
}

R是正确的,默认堆栈大小会用很多线程来咀嚼内存。