pthread_exit () и pthread_join () не работают [дубликат]
Я не знаю, почему он не возвращает введенное мной значение. Я знаю, что это не
void* arg
потому что он печатает правильный номер, но я понятия не имею.
КОД:
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>
void* stampa(void* arg) {
float dato = *(float*)arg;
printf("Read: %f\n", dato);
pthread_exit((void*)&dato);
}
// Main
int main() {
system("clear");
pthread_t miot;
int creathread;
float x;
float *status;
printf("Number: ");
scanf("%f", &x);
creathread = pthread_create(&miot, NULL, stampa, (void*)&x);
if (creathread != 0) {
printf("Error\n");
}
pthread_join(miot, (void*)&status);
printf("Returned: %f\n", *status);
return 0;
}
РЕЗУЛЬТАТ:
Number: 10
Read: 10.000000
Returned: 0.000000
1 ответ
void* stampa(void* arg) {
float dato = *(float*)arg;
printf("Read: %f\n", dato);
pthread_exit((void*)&dato);
}
dato
больше не существует, как только функция вернется. Принимая адрес этой переменной и разыменовывая его после возврата из функции (обратно в поток), вы вызываете неопределенное поведение.
Вы также можете:
- Приведите и верните значение напрямую (как если бы это был указатель) и верните его обратно в
main
.- Это может нарушить некоторые правила (это
void *
гарантированно будет достаточно большим, чтобы вместитьfloat
?), но я часто видел, как это используется.
- Это может нарушить некоторые правила (это
- Выделить объект с помощью
malloc
и верните этот указатель.
Первый вариант:
void* stampa(void* arg) {
float dato = *(float*)arg;
printf("Read: %f\n", dato);
pthread_exit((void*)dato);
}
// Main
int main() {
system("clear");
pthread_t miot;
int creathread;
float x;
float status;
printf("Number: ");
scanf("%f", &x);
creathread = pthread_create(&miot, NULL, stampa, (void*)&x);
if (creathread != 0) {
printf("Error\n");
}
pthread_join(miot, (void*)&status);
printf("Returned: %f\n", status);
return 0;
}