Linux系统编程线程栈大小

Posted itcast0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程线程栈大小相关的知识,希望对你有一定的参考价值。

00. 目录

 

文章目录

 

01. 概述

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

  • 进程中的所有的线程共享相同的地址空间。
  • 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。
  • 一个线程真正拥有的唯一私有储存是处理器寄存器。
  • 线程栈可以通过暴露栈地址的方式与其它线程进行共享。

有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错误。

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$ 

 

 

以上是关于Linux系统编程线程栈大小的主要内容,如果未能解决你的问题,请参考以下文章

Linux下一个进程究竟会有多少个线程

linux socket编程系统调用栈

在windows数据栈溢出,在linux系统就没有栈溢出,为啥

Linux多任务编程——线程

Go并发编程

Linux(程序设计):66---简略版的线程池设计