我用C语言编写了一些程序,在Linux中创建了很多Pthread。
当我用很少的线程运行程序时,它可以工作,但一旦我让它创建大约1000个线程,它就会给出错误。现在设置了errno标志,但我想知道是哪个问题导致了它。EAGAIN、EINVAL、ELEMULTITHREADFORK或ENOMEM。
有没有办法找出这是不是这些错误中的一个,如果是,是哪一个?
发布于 2011-04-08 01:55:30
我相信您正在寻找的是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不能用于检查结果,并且除非将返回值赋给errno,否则perror将无法工作。相反,你可以这样做:
result = pthread_create(&td, &attr, start_function, start_art);
switch (result) {
case EINVAL: /* ... */
case EAGAIN: /* ... */
/* etc. */
}发布于 2011-04-08 01:52:57
perror()应该可以做到这一点。
在linux系统上执行man 3 perror。
发布于 2011-04-08 02:22:03
只是为了进行简单的测试:
int ret;
pthread_t tid;
if ((ret = pthread_create(&tid, NULL, startfunc, NULL)) != 0)
{
errno = ret;
perror("pthread_create");
}R是正确的,默认堆栈大小将占用那么多线程的内存。
https://stackoverflow.com/questions/5585292
复制相似问题