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

起因:在一段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指定栈空间大小。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值