先来讲说线程内存相关的东西,主要有下面几条:
- 进程中的所有的线程共享相同的地址空间。
- 任何声明为 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");
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;
}
编译代码时,需要加上 -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; //堆栈大小设置为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;
}
运行结果如下:
---------------------
作者:Mike__Jiang
来源:CSDN
原文:https://blog.csdn.net/tennysonsky/article/details/48767415
版权声明:本文为博主原创文章,转载请附上博文链接!