简体   繁体   中英

Segmentation fault after the call of pthread_join()

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);

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

I think the problem is that your end pointer passed to pthread_join() isn't actually pointing anywhere. Try the following:

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);
}

A segmentation fault merely means that you've tried to make a memory access or jump to some location in memory that the OS hasn't allowed you to either execute code from or read/write from. In this case where is your spawned child thread suppose to return to after the pthread_join() call since the OS has cleaned up the main parent process and reclaimed the all the memory used by the main parent process (this includes execution code as well as stack-space, heap-space, etc.)? ... It's definitely not memory that a user-land thread has access to, hence the OS throws a segmentation fault.

You call pthread_exit() in the main thread, which then itself immediately exits by coming to the end of main(), ending the process. The second thread unblocks and finds itself in a very strange position. At this point you are deep in undefined behaviour land. You should call pthread_join from the main thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM