0

我不知道为什么它不返回我输入的值。我知道不是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
4

1 回答 1

0
void* stampa(void* arg) {
    float dato = *(float*)arg;
    printf("Read: %f\n", dato);
    
    pthread_exit((void*)&dato);
}

dato函数一返回就不再存在。通过获取该变量的地址并在函数返回(回到main线程中)后取消引用它,您正在调用未定义的行为。

您可以:

  • floatto 直接转换为void *并返回(就好像它是一个指针一样)并将其转换回floatin main
    • 这可能会违反一些规则(void *保证 a 大到足以容纳 a 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;
}
于 2021-03-19T11:59:07.957 回答