Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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);
like image 493
user454322 Avatar asked Dec 04 '25 11:12

user454322


1 Answers

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.

like image 125
simonc Avatar answered Dec 06 '25 03:12

simonc



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!