linux c 多线程 传参,linux c语言多线程编程怎么传递参数?创建线程后立刻返回,出现段错误(Segmentation fault)的原因和解决办法...

linux 下 c 语言编程,使用多线程是方便的。有时候,我们需要函数创建线程后立刻返回,线程继续在后台运行。可是,却很容易出现段错误(Segmentation fault),请看下面这段代码:

982264f087b6145822733a62d8e67438.png

我们编译执行,发现出现了段错误:

这是为什么呢?

37398a86301cf77110aabe3b72486cb4.png

创建线程后立刻返回,出现段错误的原因

linux 下程序每调用一个函数,就会为该函数创建一个栈帧,被调用函数的局部变量等信息都会保存在栈帧里。被调用函数返回后,它的栈帧就会被销毁了。如果之前传递了栈帧里的参数给线程函数,此时线程函数再引用这里的参数,操作系统就会判定引用非法,就会出现Segmentation fault(段错误)。

我们来看看上述代码的对应的汇编代码:

29f612aac3e52a1eba84b49152cd0e52.png

解决办法

问题的关键就是线程函数引用的参数被销毁了,那么只要不让其销毁,就不会出现段错误了。方法有两个,一是创建全局变量作为传递给线程函数的参数,全局变量不会随着函数的返回被销毁。一是动态分配一个变量作为线程函数的参数,动态分配的变量存在堆中,也不会在函数返回时被销毁。因为全局变量对程序的独立封装性有破坏,所以下面的例子使用了动态分配变量来解决问题:

编译执行结果如下:

成功了,程序没有再出现段错误。这样,我们就解决了函数创建线程后立刻返回,线程出现段错误(Segmentation fault)的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值