由问题引发的线程栈空间探究

2023-11-20

起因:在一段C++程序中使用sprintf函数,程序运行时挂掉了,看了半天觉得程序写得没啥毛病,单独把这段程序搂出来放在main函数里运行结果是正确的,经过大师的指点,怀疑时栈空间不够导致的,网上查了一些资料记录一下。

ulimit -a查看栈空间默认大小,一般为8192k即8MB

测试栈空间程序:

#include <stdio.h>

int testtack(int num)
{
    int buff[num];
    printf("num is %d\n", num);
    return 0;   
}
int main(int argc, char* argv[])
{  

    int buflen = 1 * 1024 * 1024;
    for(; buflen < 8 * 1024 * 1024; buflen++)
        testtack(buflen);
    printf("hello, world");
    return 0;
}

参考网址:https://blog.csdn.net/elfprincexu/article/details/78779158

1、进程栈大小是执行时随机确认的,至少比线程栈要大,但不会超过2倍;

线程栈是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改;

线程从进程栈分配空间,大小并不是固定的,如果分配空间大于进程栈空间,那么直接运行时出现段错误,每个线程拥有独立的栈空间,为了避免线程之间的栈空间踩踏,线程栈之间还会有以小块guardsize用来隔离保护各自的栈空间,一旦另一个线程踏入到这个隔离区,就会引发段错误。

参考网址:https://blog.csdn.net/liyuanyes/article/details/44097731

2、linux中主线程的栈空间要比子线程大,子线程可以使用的栈空间是stack size,而主线程能使用的栈空间要比子线程大很多(2M)

 

参考网址:https://www.linuxidc.com/Linux/2011-02/32385.htm

https://www.cnblogs.com/dongzhiquan/p/4141598.html

解决方法:

1、使用malloc在堆上进行动态空间分配

2、如果是主线程栈空间问题,通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M

可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小

如果是子线程,可以在创建线程时通过pthread_attr指定栈空间大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由问题引发的线程栈空间探究 的相关文章

  • 按照 C++ 11 标准,数组,指针,传递问题!

    一 一维数组 静态 int array 100 定义了数组array 并未对数组进行初始化 静态 int array 100 1 2 定义并初始化了数组array 动态 int array new int 100 delete array
  • Java 日历的制作 心得 写给自己

    之前已经跟着老师做过一次这个日历 但是时间一久便又拿出来自己再复习一遍 果然不出所料 已经做不出来了 而且因为在学习的时候使用的是Myeclipse 其中话中操作是由软件自己操作的 每写出一句代码软件也会自动提示哪里有问题 半傻瓜式的操作果

随机推荐

  • HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能;

    在日常项目中 html5的video标签还是比较常用到的 开发过程中 我们都会使用到 通过监听video标签的播放 暂停 停止等等来使用 我们是否也会遇到过 有些浏览器在显示这标签 兼容不太友好 video标签的封面是一层黑色的 ok 那么
  • git-基本操作-1

    1安装 window上安装git 官网直接下载 下载完成后需要在git bash命令行中输入 git config global user name yourname git config global user email yourema
  • 非常详细的小程序搜索历史功能

    前言 我们在进行一些项目开发时 很有可能会涉及到在搜索框中搜索某一个词条 从而进行相应的检索 在这里就会出现一个优化功能 我们在搜索后的某一个词条 我希望能够显示在历史记录中 这样一个小的tip 可以给用户带来更高的使用体验 历史记录并不会
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • 浅谈图数据库

    本文主要讨论图数据库背后的设计思路 原理还有一些适用的场景 以及在生产环境中使用图数据库的具体案例 从社交网络谈起 下面这张图是一个社交网络场景 每个用户可以发微博 分享微博或评论他人的微博 这些都是最基本的增删改查 也是大多数研发人员对数
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • mysql jdbc 实现读写分离

    这种方式直接在代码级别实现了mysql 读写分离 很简单 只需要改一下配置文件 就搞定了 是不是很嗨 jdbc driverClassName com mysql jdbc ReplicationDriver jdbc url jdbc m
  • Windows10安装Markdown安装教程(超级详细)

    markdown其实就是我们平常写博客的地方 下面我来详细介绍它的安装教程 首先到官网去安装 markdown 点击download 我反正点击download后它自动就下载了 然后下载好后是安装包 双击 然后一直next 最后它会跳出来
  • 被火车撞了都不能忘记的几道题(你会了吗?)

    目录 一 删除有序链表中的重复元素I 二 删除有序链表重复元素II 三 环形单链表中插入一个元素 四 单链表翻转II 五 奇偶链表 一 删除有序链表中的重复元素I 1 对应牛客网链接 删除有序链表中重复的元素 I 牛客题霸 牛客网 nowc
  • 吴恩达机器学习笔记1:手写linear regression

    最近手写了linear regression 有以下几点收获 做batch gradient descent时 注意每一轮迭代要使用同一个error同时更新所有参数 归一化的时候 要注意记录相应的均值和方差 后续对新样本做预测时也需要使用这
  • OpenHarmony 3.1 Beta版本关键特性解析——探秘隐式查询

    以下内容来自开发者分享 不代表 OpenHarmony 项目群工作委员会观点 徐浩 隐式查询是 OpenAtom OpenHarmony 以下简称 OpenHarmony 的一个基础能力 被广泛应用于各种应用中 如视频播放 阅读器播放等 应
  • 【优化】Spring热部署Devtools:不用每次修改一点点就重启Spring

    第一步 add dev
  • linux ip add address,Linux IPv6 地址配置

    添加IPV6地址 ip 6 addr add dev ip 6 addr add 2001 0db8 0 f101 1 64 dev eth0 ifconfig inet6 add ifconfig eth0 inet6 add 2001
  • nacos 部署 Could not retrieve transation read-only status server

    nacos 低版本 部署的时候 mysql 数据库版本高于驱动时 数据操作时 会报 Unknown system variable tx read only Could not retrieve transation read only s
  • 测试udp服务的端口是否可用

    测试tcp服务的端口是否可用 可以使用 telnet ip port 但是如果这个用在upd服务上 就会报错 因为telnet走的是tcp协议 比如说192 168 80 131在8888端口上上启了个udp的服务 这时使用telnet 1
  • 【快速选择算法】O(n)时间复杂度

    快速选择的期望时间复杂度为O n 最坏时间复杂度为O n 2 当每次划分只划分为n 1个和1个时 由于划分时间复杂度为O n 最坏时间复杂度为O n 2 void quickselect vector
  • statsmodels.tsa.arima.model.ARIMA用户手册(中文)(statsmodels包)

    0 前言 class statsmodels tsa arima model ARIMA endog exog None order 0 0 0 seasonal order 0 0 0 0 trend None enforce stati
  • SpringSecuit详解,写的很好

    转自 https www jianshu com p 08cc28921fd0 8 6 Spring Boot集成Spring Security 开发Web应用 对页面的安全控制通常是必须的 比如 对于没有访问权限的用户需要转到登录表单页面
  • 3.基于STM32C8T6的四旋翼无人机的飞控制作----理论准备3,四旋翼姿态控制理论

    4 四旋翼姿态控制理论 四旋翼的姿态控制理论是真正动手前必须学习的一部分理论 要先明白如何通过控制四个电机来控制飞机姿态 才明白如何编写控制程序 姿态控制要简单分为两部分 第一部分为飞行参数及作用概念 第二部分为PID控制理论 第一部分 飞
  • 由问题引发的线程栈空间探究

    起因 在一段C 程序中使用sprintf函数 程序运行时挂掉了 看了半天觉得程序写得没啥毛病 单独把这段程序搂出来放在main函数里运行结果是正确的 经过大师的指点 怀疑时栈空间不够导致的 网上查了一些资料记录一下 ulimit a查看栈空