少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述Linux系统编程线程栈大小相关的知识,希望能为你提供帮助。
00. 目录
文章目录
-
- 00. 目录
- 01. 概述
- 02. 设置线程栈函数
- 03. 附录
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$
推荐阅读
- AndroidAndroid中Intent的用法总结
- 似乎无法在wordpress中更改我的CSS代码
- Woocommerce的Flatsome(INC文件夹中的Annul文件)
- 致命错误(第463行的C:\xampp\htdocs\AKS_Shop\wp-includes\Requests\Transport\cURL.php中超过30秒的最大执行时间)
- 致命错误(无法重新声明function()-WP主题)
- 致命错误(在第2行的index.php中调用未定义的函数get_header())
- 这里的WordPress主题有什么问题吗()
- 通过WordPress仪表板导出wp内容()
- 在样式化时排除特定的元素