user454322 user454322 - 3 months ago 15
C Question

pthread_t pointer as argument of pthread_create

The first argument of pthread_create is a pthread_t pointer. In the hello program below, if the first argument is a pointer to pthread_t (

pthread_t*
) instead of a pthread_t (
pthread_t
) the program ends with
Segmentation fault
...why?





I don't remember seeing
pthread_t*
as the declared type of the first argument of
pthread_create
.

And chapter 2 of Butenhof's book Programming with POSIX Threads says:


To create a thread, you must declare a variable of type
pthread_t
[not
pthread_t*
].


But according to the specification the first argument of
pthread_create
is a pointer to
pthread_t
, so why the segmentation fault?





Segmentation fault

pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);






Runs OK

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);






hello program:

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

void *
hello(void *arg){
printf("Hello\n");
pthread_exit(NULL);
}

int
main(int argc, char **argv){
pthread_t thr = 1;
pthread_create(&thr, NULL, &hello, NULL);



pthread_join(thr, NULL);

return 0;
}





pthread_create prototype:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);

Answer
pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);

declares a pointer to a pthread_t without allocating storage for it. When you call pthread_create, it'll try writing to *thr. This is at an undefined location and will almost certainly fail.

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);

works because you've declare storage (thr on the stack) for a pthread_t.

Note that the second, working, version can be simplified to what is used in your hello program

pthread_t thr;
pthread_create(&thr, NULL, &hello, NULL);

...which declares a pthread_t on the stack then passes a pointer to it into pthread_create.