Linux系统编程线程栈大小

少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述Linux系统编程线程栈大小相关的知识,希望能为你提供帮助。
00. 目录
文章目录

    • 00. 目录
    • 01. 概述
    • 02. 设置线程栈函数
    • 03. 附录

01. 概述先来讲说线程内存相关的东西,主要有下面几条:
  • 进程中的所有的线程共享相同的地址空间。
  • 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。
  • 一个线程真正拥有的唯一私有储存是处理器寄存器。
  • 线程栈可以通过暴露栈地址的方式与其它线程进行共享。
【Linux系统编程线程栈大小】有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错误。
pthread_create()创建线程时,若不指定分配堆栈大小,系统会分配默认值,通过命令查看方法如下:
Linux系统编程线程栈大小

文章图片

上面的单位为 Kb,所以,线程默认堆栈大小为 8M。
也可以在终端下通过 ulimit -s value 用来重新设置 stack 大小。
一般来说,默认堆栈大小为 8388608,堆栈最小为 16384, 单位为字节。在某些嵌入式系统中,如果其内存不是很大,若采用默认值的话,会导致出现问题,若内存不足,则 pthread_create() 会返回 12,其定义如下:
#define EAGAIN 11 #define ENOMEM 12 /* Out of memory */

02. 设置线程栈函数可以使用 pthread_attr_getstacksize() 和 pthread_attr_setstacksize() 的方法来获取和设置线程的堆栈空间。
查看线程堆栈大小示例代码如下:
#include < stdio.h> #include < stdlib.h> #include < pthread.h> //线程操作所需头文件 int main(void) { size_t stack_size = 0; //堆栈大小变量 pthread_attr_t attr; //线程属性结构体变量 //初始化线程属性 int ret = pthread_attr_init(& attr); if(ret != 0) { perror("pthread_attr_init"); return -1; } //获取当前的线程栈大小 ret = pthread_attr_getstacksize(& attr, & stack_size); if(ret != 0) { perror("pthread_attr_getstacksize"); return -1; } //打印堆栈值 printf("stack_size = %dB, %dk\\n", stack_size, stack_size/1024); return 0; }

执行结果:
deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c -pthread deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out stack_size = 8388608B, 8192k deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$

设置线程堆栈大小示例代码如下:
#include < stdio.h> #include < stdlib.h> #include < pthread.h> //线程操作所需头文件 int main(void) { size_t stack_size = 0; //堆栈大小变量 pthread_attr_t attr; //线程属性结构体变量 //初始化线程属性 int ret = pthread_attr_init(& attr); if(ret != 0) { perror("pthread_attr_init"); return -1; } stack_size = 1024*20; //堆栈大小设置为20K ret = pthread_attr_setstacksize(& attr, stack_size); //设置线程堆栈大小 if(ret != 0) { perror("pthread_attr_getstacksize"); return -1; } stack_size = 0; ret = pthread_attr_getstacksize(& attr, & stack_size); //获取线程堆栈大小 //打印堆栈值 printf("stack_size = %dB, %dk\\n", stack_size, stack_size/1024); return 0; }

执行结果:
deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out stack_size = 20480B, 20k deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$



    推荐阅读