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.
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.