Segmentation fault after the call of pthread_join()

pradeepchhetri picture pradeepchhetri · May 3, 2011 · Viewed 11k times · Source

I have written the following code using the POSIX pthread library:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

pthread_t pid1,pid2;

void *test(void *arg)
{
void **end;
printf("\nNew Thread ID: 0x%x\n",(unsigned int)pid2);
pthread_join(pid1,end);
printf("\nNew Thread going to go off\n");
printf("\nNew Thread ID: 0x%x\n",(unsigned int)pid2);
return ((void *)NULL);
}    

int main()
{
pid1 = pthread_self();
pthread_create(&pid2,NULL,test,NULL);
printf("\nMain Thread ID: 0x%x\n",(unsigned int)pid1);
sleep(2);
printf("\nI am going off\n");
pthread_exit(0);
}

On executing the code I got the following output:

Main Thread ID: 0xb7880b30
New Thread ID: 0xb787eb70
I am going off
Segmentation fault

As I studied, the thread(pid2) calling the pthread_join will block until the thread passed in argument(pid1) calls pthread_exit(). And pthread_exit() is used to stop the execution of a particular thread letting all others to keep on executing.

I want to know why I got Segmentation Fault at last.

Please explain me properly.

Answer

You're using an uninitialized variable, void **end;, which results in undefined behavior:

pthread_join(pid1,end);

What you should instead be doing is:

void *end;
pthread_join(pid1, &end);

i.e. passing a meaningful pointer to a variable in which you want the result, rather than an uninitialized pointer.