C 查找线程堆栈大小
我只是在64位SLES linux上测试pthread_attr_getstacksize()的用法C 查找线程堆栈大小,c,multithreading,pthreads,C,Multithreading,Pthreads,我只是在64位SLES linux上测试pthread_attr_getstacksize()的用法 #include <stdio.h> #include <limits.h> #include <errno.h> #include <stdlib.h> #include<string.h> #include <sys/file.h> #include <sys/mman.h> #include <sys
#include <stdio.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#include<string.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <pthread.h>
void* doSomeThing(void *arg)
{
unsigned long i = 0;
pthread_t id = pthread_self();
printf(">>> id = 0x%x\n", id);
for(i=0; i<(0xFFFFFFFF);i++);
return NULL;
}
main(int argc, char* argv[])
{
pthread_attr_t pattr;
pthread_t thread;
int error = 0;
size_t ssize=0;
error = pthread_attr_init(&pattr);
if(error)
goto Return;
error = pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED);
if (error)
goto Return;
error = pthread_attr_getstacksize(&pattr , &ssize);
printf(" >>> ssize = %u\n", ssize);
error = pthread_create(&thread, &pattr, &doSomeThing, NULL);
if(error != 0)
{
printf("\ncan't create thread :[%s]", strerror(error));
}
else
{
printf("\n Thread created successfully\n");
}
Return:
return(0);
}
另外,当ulimit将堆栈大小显示为8MB时,为什么pthread_attr_getstacksize()返回以GBs为单位的堆栈大小
堆栈大小很大,因此我无法创建超过186个线程,因为pthread_create失败,出现错误12(ENOMEM)
它给了我不同的堆栈大小,如1145007420257564864147952480不同的时间。为什么堆栈大小不同
我认为这是你操作系统中的一个bug
根据我之前对各种*nix系统(Solaris、AIX、HP-UX)、Debian/Ubuntu、SLES10和RHEL5的实验,默认堆栈大小(您查询并打印)是稳定的,在运行之间不会波动
我所看到的唯一大小变化与同一应用程序的32位版本与64位版本有关。正如所料,对于64位应用程序,默认线程堆栈大小大于32位应用程序
另外,当ulimit将堆栈大小显示为8MB时,为什么pthread_attr_getstacksize()返回以GBs为单位的堆栈大小
ulimit
显示主线程的堆栈大小,而不是线程堆栈大小
主堆栈(由调用main()
的线程使用)是特殊的,因为它是由内核创建的,分配在更高的内存地址,理论上它甚至可以增长到堆的末尾(由brk()
返回的值)
相反,线程堆栈由应用程序本身分配,甚至可以在堆中分配(尽管通常使用匿名mmap()
)。它不是专门处理的:它是一个普通的内存块,不管如何分配,它将在线程终止后由应用程序释放
堆栈大小很大,因此我无法创建超过186个线程,因为pthread_create失败,出现错误12(ENOMEM)
- 向SUSE报告问题
- 使用
在应用程序中显式设置大小。大多数*nix系统的默认线程堆栈大小约为256-512K,Solaris-2MB,Ubuntu-8MB。对于许多应用程序来说,512K就足够了,但是如果您的应用程序在堆栈上放置大型结构/阵列,那么8MB将是一个更安全的值pthread\u attr\u setstacksize()
线程属性
?在哪里调用pthread\u attr\u getstacksize
?你能发布一个MVCE吗?对不起,它是“pattr”而不是“thread\u attr”。我在pthread_create()之前调用pthread_attr_getstacksize()。MVCE是什么意思?MVCE:我用演示代码修改了原始问题。我看到的唯一问题是您应该使用%zu
打印ssize
。我无法重现这个问题。你使用的是什么系统?
# ulimit -a
...
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) 1635484
...
stack size (kbytes, -s) 8192
...
max user processes (-u) 14942
virtual memory (kbytes, -v) 1539280