Функция возврата в pthread_join - PullRequest
1 голос
/ 28 февраля 2020

Я учу потоки в C в ОС. Я не знаю, почему следующий код дает мне ошибку сегментации. Может ли кто-нибудь помочь мне здесь? Я также немного смущен тем, как pthread_join использует свой аргумент void ** retval. Какова его функция?

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

void *thread (void *vargp) {
   int* arg = *((int*)vargp);
   return (void*)arg;
}   

int main () {
   pthread_t tid;
   int thread_arg = 0xDEADBEEF;
   int *ret_value;
   pthread_create(&tid, NULL, thread, &thread_arg);
   pthread_join(tid, (void **)(&ret_value));
   printf("%X\n", *ret_value);
   return 0; 
}

1 Ответ

2 голосов
/ 28 февраля 2020

Это не правильно:

int* arg = *((int*)vargp);  

(int*)vargp приведите ваш void* к int*. Но, написав int* arg = *((int*)vargp);, вы указываете arg указателю ЗНАЧЕНИЕ (0xDEADBEEF) аргумента vargp. Это значение (0xDEADBEEF) не является допустимым адресом.
Какая версия вашего компилятора? потому что он должен предупредить вас:

неверное преобразование из int в int*

Вы должны написать:

int* arg = (int*) vargp;
...