将void*延迟为float时数据丢失
Data loss while Deferencing void* to float
我已经完成了两个线程,并使用线程函数计算PI的值。我试图将线程函数的值返回到main中(如示例所示,用于计算PI),但它并没有给我正确的答案。每当我运行它时,线程函数的cout语句都会给出正确的答案,但在取消引用void*运算符时,我不会得到同样的答案。这是我的代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<sys/types.h>
#include<unistd.h>
#include<string>
#include<math.h>
using namespace std;
class ThreadObj
{
public:
int n;
float flag;
};
void* Func(void* param)
{
float num, den,partialN;
float partialSum = 0;
ThreadObj* obj1 = (ThreadObj*)param;
num = obj1->flag;
partialN = obj1->n;
for ( int i=0; i<partialN; i++)
{
if(num==1)
{
den = 4*i + 1;
}
else
{
den = 4*i+3;
}
partialSum = partialSum + (num/den);
}
cout<<"Answer of Thread's execution is: "<<partialSum<<endl;
//Returning the answer and casting it into appropriate datatype (void*)
void* ReturnPointer;
ReturnPointer = &partialSum;
return ReturnPointer;
//return (void*) partialSum;
//return partialSum;
}
int main()
{
float n;
float sum=0;
cout<< "Enter number of iteration: "<<endl;
cin>> n;
pthread_t Thread1, Thread2;
//Use 1st Thread to calculate the +ve terms
ThreadObj obj1;
obj1.n = n/2;
obj1.flag = 1.0;
pthread_create(&Thread1,NULL,&Func, &obj1);
//Use 2nd Thread to calculate the -ve terms
ThreadObj obj2;
obj2.n = n/2;
obj2.flag = -1.0;
pthread_create(&Thread2,NULL,&Func, &obj2);
//Getting value from both threads
float PartialSum1=0, PartialSum2=0;
void* p1 = &PartialSum1;
void* p2 = &PartialSum2;
//pthread_join(Thread1,NULL);
pthread_join(Thread2, (void**) p1);
pthread_join(Thread1, (void**) p2);
cout<<endl<<"Partial Sum2 is: "<<PartialSum2<<endl;
cout<<endl<<"Partial Sum1 is: "<<PartialSum1<<endl;
sum = PartialSum1 + PartialSum2;
sum = sum * 4;
cout<< "Value of PI: "<<sum;
cout<<endl;
return 0;
}
样本输出为:
输入迭代次数:100
线程执行的答案是:-1.25072线程执行的答案是:2.03362
部分Sum2为:-1.12921e-05
部分Sum1为:-5664419e-06PI值:-6.77452e-05
您正在返回一个指向函数末尾超出范围的局部变量的指针。这是一种未定义的行为,因此会导致垃圾。
我建议,与其返回void*
,不如将另一个参数传递给函数,并将结果放入其中。
相关文章:
- 如何在 c++ 中将数据从文件读取到 int/float 值
- tensorflow C API中的float数据类型
- typedef float _float32;的声明说明符中的两种或多种数据类型;
- 在C++/Visual Studio中,通过给定数据格式(doubles、float、int、1位bools)的UDP发
- 从'float'到"int32"的C ++转换,可能会丢失数据
- 如何在C++中为integer、float和double数据类型同时重载运算符
- 将值分配给Float数据类型崩溃程序
- 铸造钻头数据To和From float
- 混淆了double和float数据类型
- 将 c++ dll 导入 vb.net 时 float*(图像类型)的等效数据类型是什么?
- 在矢量到矢量中复制数据<float> <Mat> (Opencv/C++)
- 比float或double更准确的数据类型?C++
- 为什么使用"int"数据类型而不是"float"数据类型?
- 将void*延迟为float时数据丢失
- 如何在创建时强制cv::Mat中的数据类型为float ?
- c++中float数据类型声明的混淆
- 如何在 Vector<Vector<float>*>* 中写入数据?
- 如何将矢量<矢量<矢量> >保存在<float>文件中并检索数据?
- "Float"数据类型的范围值(以C++为单位)
- 数据类型为float、float4、float8、double、double4、int、int4、int8的模板