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;
}
Другие вопросы по тегам