bil*_*ill 2 c unix linux stack-overflow pthreads
我在C语言编程,在Linux中创建了很多Pthreads.
当我使用少量线程运行程序时,它可以工作,但是一旦我创建了大约1000个线程,它就会产生错误.现在errno标志已设置,但我想知道导致它的哪个问题.EAGAIN,EINVAL,ELEMULTITHREADFORK,或ENOMEM.
有什么方法我可以发现它是否是这些错误之一,如果是,它是哪一个?
我相信你正在寻找的是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);
Run Code Online (Sandbox Code Playgroud)
此代码过于简化; 当然,你可能想要检查一些这些电话的失败.实际上这就是你最初的问题.pthread_*函数几乎都返回错误代码作为它们的返回值而不是in errno,因此errno不能用于检查结果,perror除非您将返回值赋值给它,否则将无法工作errno.相反,做一些像:
result = pthread_create(&td, &attr, start_function, start_art);
switch (result) {
case EINVAL: /* ... */
case EAGAIN: /* ... */
/* etc. */
}
Run Code Online (Sandbox Code Playgroud)