我正在用C语言编写一些在Linux中创建大量Pthread的东西。
当我使用少量线程运行程序时,它可以工作,但是一旦我创建了大约1000个线程,它就会产生错误。现在设置了errno
标志,但我想知道导致它的哪个问题。 EAGAIN
,EINVAL
,ELEMULTITHREADFORK
或ENOMEM
。
有什么方法可以找出是否是这些错误之一,如果是,那是哪一个?
答案 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是正确的,默认堆栈大小会用很多线程来咀嚼内存。