在线程中安全地返回浮点值

Safely returning float value in threads

我希望使线程 return 成为浮点值。 将数据类型从 float 更改为 long 可以正常工作,但不适用于 float。 有什么帮助吗?谢谢

void * funcFloat(void * arg){
    float x = *(float *)arg;
    printf("Received: %f\n", x);
    return (void *)x;
}

尝试

void * funcFloat(void * arg){
   return arg;
}

 void * funcFloat(void * arg){

     float * f = malloc(sizeof(f));
     *f = 1.2345667f;
     return f;
 }

然后获取 return 值的所有者进行整理

正如另一个答案所指出的,您最初的问题是当您应该 return 指向它的指针时,您正在 return 浮点数本身 (x)。

关于您关于使用 pthread_join() 获取 return 值的评论,请注意其原型:

int pthread_join(pthread_t thread, void **retval);

它在第二个参数中需要一个指向 void * 指针 ,这就是为什么调用 pthread_join(tf, (void *)&z); 其中 z 是一个 float 不起作用。这是一个工作示例,减去错误检查:

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

void * funcFloat(void * arg){
    float x = *(float *)arg;
    printf("Received: %f\n", x);
    float *returnf = malloc(sizeof(returnf));
    *returnf = x;
    return returnf;
}

main(int argc, char **argv) {
    pthread_t thread;
    float f = 3.14159;
    float f2;
    float *joinedf = NULL;

    pthread_create(&thread, NULL, funcFloat, &f);
    pthread_join(thread, (void **)&joinedf);
    f2 = *joinedf;
    free(joinedf);

    printf("final: %f\n", f2);
}