问题描述:主线程里创建一个子线程,主线程调用pthread_join()等待子线程执行完成再结束,但是子线程的执行体执行完成之后,出现段错误Segmentation fault,在主线程pthread_join()调用前后都加上打印信息,发现接口调用之前的打印有,接口调用之后的打印没有;
问题分析:pthread_join()接口就是一个阻塞函数,等待子线程执行,子线程执行体执行完之后,会继续执行pthread_join()后面的代码,所以出现问题的代码就一定是子线程的执行体,出现Segmentation fault,很可能就是有内存方面的泄露,内存没有释放,数组越界,要重点看一下子线程执行体内部的指针和数组,是否有这方面的问题,最终发现是数组出现了越界;分析代码如下:
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#if 0
void *thread_function(void *arg)
{
char str[8] = {0};
sprintf(str, "hhhhhhhhhhhhhhhhhhhhhhh");
std::cout << "sizeof str = " << sizeof(str) << std::endl;
std::cout << "sizeof str = " << strlen(str) << std::endl;
return NULL;
}
int main(void)
{
pthread_t mythread;
if (pthread_create(&mythread,NULL,thread_function,NULL))
{
printf("error creating thread.");
// abort();
}
printf("<<<<< thread is running");
if( pthread_join(mythread,NULL))
{
printf("error join thread.");
//abort();
}
printf("thread done! \n");
//exit(0);
}
#endif
void Function()
{
char str[8] = {0};
sprintf(str, "hhhhhhhhhhhhhhhhhhhhhhhhhh");
std::cout << "Function is called" << std::endl;
std::cout << str << std::endl;
std::cout << "sizeof str = " << sizeof(str) << std::endl;
std::cout << "sizeof str = " << strlen(str) << std::endl;
}
int main()
{
std::cout << "hello" << std::endl;
Function();
std::cout << "world" << std::endl;
}
在子线程里对一个数组进行赋值,在子线程执行体内部使用时,是没有任何问题的,一旦要退出线程执行体,就会报段错误,就是因为在执行体里定义的局部数组str出现了越界,使用的时候是没有任何问题的,一旦要退出执行体时,就要释放局部的数组str占的栈空间,定义的是8个字节,但是赋值确实大于8个字节,str的长度大于8,释放的时候踩到其他内存了;