先来讲说线程内存相关的东西,主要有下面几条:

  • 进程中的所有的线程共享相同的地址空间。
  • 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。
  • 一个线程真正拥有的唯一私有储存是处理器寄存器。
  • 线程栈可以通过暴露栈地址的方式与其它线程进行共享。
有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错误。
pthread_create()创建线程时,若不指定分配堆栈大小,系统会分配默认值,通过命令查看方法如下:
上面的单位为 Kb,所以,线程默认堆栈大小为 8M
也可以在终端下通过 ulimit -s  value 用来重新设置 stack 大小。
一般来说,默认堆栈大小为 8388608,堆栈最小为 16384, 单位为字节。在某些嵌入式系统中,如果其内存不是很大,若采用默认值的话,会导致出现问题,若内存不足,则 pthread_create() 会返回 12,其定义如下:
#define EAGAIN 11#define ENOMEM 12 /* Out of memory */

我们用 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");}//获取当前的线程栈大小ret = pthread_attr_getstacksize(&attr, &stack_size);return -1;if(ret != 0){perror("pthread_attr_getstacksize");return -1;}//打印堆栈值printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);return 0;
}

编译代码时,需要加上 -lpthread,运行结果如下:

设置线程堆栈大小示例代码如下:
#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; //堆栈大小设置为20Kret = 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;
}

运行结果如下:
参考资料:
http://www.cnblogs.com/qq78292959
http://blog.csdn.net/horstlinux

【Linux系统编程】线程堆栈大小的使用介绍相关推荐

  1. Linux系统编程——线程私有数据

    在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...

  2. linux限制堆栈大小,进程超过RedHat Enterprise Linux 6的线程堆栈大小限制?

    我在RHEL 6.3上运行了几个进程,但由于某种原因,它们超出了线程堆栈大小. 例如,Java进程在启动时在运行时被赋予-Xss256k的堆栈大小,并且在实际代码中使用pthread_attr_set ...

  3. Linux系统编程——线程(1)

    目录 线程概要 Linux内核线程实现原理 线程的共享/不共享资源 线程优缺点 线程控制原语 pthread_self pthread_create pthread_exit pthread_join ...

  4. Linux系统编程——线程

    一.线程概念 基础 线程又称LWP:light weight process 轻量级的进程,(在linux环境下)本质仍是进程.进程:独立地址空间,拥有PCB 线程:有独立的PCB,但没有独立的地址空 ...

  5. Linux系统编程——线程池

    http://blog.csdn.net/tennysonsky/article/details/46490099# 线程池基本原理 在传统服务器结构中,常是有一个总的监听线程监听有没有新的用户连接服 ...

  6. 入门Linux系统编程--网络编程

    文章目录 一.网络编程 1.socket服务端代码实现(无连接客户端) 6.socket服务端代码实现(连接客户端) 7.socket客户端代码实现 8.实现双方聊天 9.多方消息收发 二.往期文章 ...

  7. 【Linux系统编程】线程栈大小

    00. 目录 文章目录 00. 目录 01. 概述 02. 设置线程栈函数 03. 附录 01. 概述 先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间. 任何声明为 ...

  8. 【Linux系统编程】守护进程、线程

    ------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1.守护进程 1.1 进程组 1.2 会话 1.3 setsid()函数 ...

  9. linux服务器开发二(系统编程)--线程相关

    线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...

最新文章

  1. NGINX由入门到精通:Nginx介绍
  2. 如何通过三视图判断立方体个数_如何通过接触角判断疏水性?疏水性与亲水性的区别...
  3. sublime text 3设置快捷键让html文件在浏览器打开
  4. cambridge ccaf potential supervisors!
  5. xshell连不上虚拟机linux的解决办法(用的默认NAT模式)
  6. 换了电脑如何使用hexo继续写博客
  7. iOS-保存图片到(自定义)相册步骤
  8. Prepared statement needs to be re-prepare
  9. js常用正则表达式(经典)
  10. inux中tail命令---用于查看文件内容
  11. position之属性
  12. 双屏幕切换成单屏,软件不显示的问题与解决方法(总结全网)
  13. easyrecovery免费数据恢复工具操作简单一键恢复数据
  14. 数据库基础知识(思维导图)
  15. Python画一个中国地图玩玩
  16. 微信支付失败-1彻底扫坑
  17. 阿里巴巴社招Java面试题做题记录
  18. 中国互联网CEO语录
  19. 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
  20. JAVA中创建线程的三种方法及比较

热门文章

  1. Jquery操作表单Select元素常用方法
  2. ie里的button标签的一个bug
  3. securecrt使用_使用securecrt提升工作效率的十个技巧
  4. 【数据结构总结】第二章:线性表
  5. 7-5 jmu-Java-03面向对象基础-05-覆盖 (3 分)
  6. Java黑皮书课后题第8章:*8.30(代数:解答线性方程)编写一个方法,解答下面的2*2线性方程组系统
  7. Java黑皮书课后题第8章:*8.25(马尔可夫矩阵)一个n*n的矩阵,如果每个元素都是正数,并且每列的元素的和为1,则成为正马尔可夫矩阵。编写下面的方法来检测矩阵是否是马尔可夫矩阵
  8. 配置加密_数据库密码配置项都不加密?心也太大了!
  9. 类方法classmethod 绑定方法
  10. BZOJ3473: 字符串【后缀数组+思维】