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

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

展开阅读全文

没有更多推荐了,返回首页