linux 下 c 语言编程,使用多线程是方便的。有时候,我们需要函数创建线程后立刻返回,线程继续在后台运行。可是,却很容易出现段错误(Segmentation fault),请看下面这段代码:
我们编译执行,发现出现了段错误:
这是为什么呢?
创建线程后立刻返回,出现段错误的原因
linux 下程序每调用一个函数,就会为该函数创建一个栈帧,被调用函数的局部变量等信息都会保存在栈帧里。被调用函数返回后,它的栈帧就会被销毁了。如果之前传递了栈帧里的参数给线程函数,此时线程函数再引用这里的参数,操作系统就会判定引用非法,就会出现Segmentation fault(段错误)。
我们来看看上述代码的对应的汇编代码:
解决办法
问题的关键就是线程函数引用的参数被销毁了,那么只要不让其销毁,就不会出现段错误了。方法有两个,一是创建全局变量作为传递给线程函数的参数,全局变量不会随着函数的返回被销毁。一是动态分配一个变量作为线程函数的参数,动态分配的变量存在堆中,也不会在函数返回时被销毁。因为全局变量对程序的独立封装性有破坏,所以下面的例子使用了动态分配变量来解决问题:
编译执行结果如下:
成功了,程序没有再出现段错误。这样,我们就解决了函数创建线程后立刻返回,线程出现段错误(Segmentation fault)的问题。