首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pthreads内存不足?

Pthreads内存不足?
EN

Stack Overflow用户
提问于 2011-04-08 01:43:41
回答 3查看 1.6K关注 0票数 2

我用C语言编写了一些程序,在Linux中创建了很多Pthread。

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

有没有办法找出这是不是这些错误中的一个,如果是,是哪一个?

EN

回答 3

Stack Overflow用户

发布于 2011-04-08 01:55:30

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

代码语言:javascript
复制
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不能用于检查结果,并且除非将返回值赋给errno,否则perror将无法工作。相反,你可以这样做:

代码语言:javascript
复制
result = pthread_create(&td, &attr, start_function, start_art);
switch (result) {
case EINVAL: /* ... */
case EAGAIN: /* ... */
/* etc. */
}
票数 8
EN

Stack Overflow用户

发布于 2011-04-08 01:52:57

perror()应该可以做到这一点。

在linux系统上执行man 3 perror

票数 2
EN

Stack Overflow用户

发布于 2011-04-08 02:22:03

只是为了进行简单的测试:

代码语言:javascript
复制
int ret;
pthread_t tid;

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

R是正确的,默认堆栈大小将占用那么多线程的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5585292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档