【Linux系统编程】线程栈大小
2020-03-06 10:49
1881 查看
00. 目录
文章目录
01. 概述
先来讲说线程内存相关的东西,主要有下面几条:
- 进程中的所有的线程共享相同的地址空间。
- 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。
- 一个线程真正拥有的唯一私有储存是处理器寄存器。
- 线程栈可以通过暴露栈地址的方式与其它线程进行共享。
有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错误。
pthread_create()创建线程时,若不指定分配堆栈大小,系统会分配默认值,通过命令查看方法如下:
上面的单位为 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$
03. 附录
3.1 博客: 线程堆栈大小 pthread_attr_setstacksize 的使用
3.2 博客: pthread之线程堆栈
- 点赞 1
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【Linux系统编程】线程堆栈大小的使用介绍
- linux系统编程:用truncate调整文件大小
- 十、Linux系统编程-进程(三)父子进程共享文件、fork和vfork、exit和_exit、atexit注册退出事件
- Linux下的系统编程与网络编程(一 Linux基础)
- Linux 系统编程学习-文件操作
- Linux 系统编程学习-文件I/O操作
- linux文件编程(1)系统调用
- Linux系统裁剪之二(Bash脚本编程之十二)
- Linux系统编程——线程池
- 增加Linux系统的swap分区的大小
- 【Linux系统编程】文件IO操作
- 【Linux系统编程】进程间通信--有名管道
- linux 如何查看硬盘大小,内存大小等系统信息及硬件信息
- 【Linux系统编程】线程同步与互斥:互斥锁
- Linux系统基础之七:Shell编程基础上
- 【Linux系统编程】Linux 线程浅析
- Linux系统编程之----》信号
- Linux 系统 I/O编程-----不带缓存的I/O操作
- linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识