在线程中安全地返回浮点值
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);
}
我希望使线程 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);
}