C 查找线程堆栈大小

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

我只是在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/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报告问题

  • 使用
    pthread\u attr\u setstacksize()
    在应用程序中显式设置大小。大多数*nix系统的默认线程堆栈大小约为256-512K,Solaris-2MB,Ubuntu-8MB。对于许多应用程序来说,512K就足够了,但是如果您的应用程序在堆栈上放置大型结构/阵列,那么8MB将是一个更安全的值


您是否初始化了
线程属性
?在哪里调用
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