Я практикую создание 3 потоков и вычисление части серии Лейбница для вычисления числа Пи.Все работает, но я не могу получить доступ к результатам вычислений, выполненных в потоках, чтобы добавить 3 числа в main.Кто-нибудь видит проблему в том, как я их возвращаю?
DRIVER.c:
/*Headers in evey file are this*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "driver.h"
#define thread_number 3
static float Pi = 3.141592;
void print_result(float * sums, float Final_pi, float error){
int i;
for(i = 1; i <= thread_number; i++)
printf("Sum done by the thread number %i: %f\n", i, *(sums + i - 1));
printf("The real PI: %f\n", Pi);
printf("PI computed by the program: %f\n", Final_pi);
printf("Error, aka difference between the two Pi above: %f\n", error);
}
int main(int argc, char** argv){
int i;/*variable for loops*/
int iterations = atoi(argv[1]);/*number of iterations given by the user*/
int error;
float sum[thread_number] = {0.0f};
data_struct args[thread_number];
pthread_t thread_id[thread_number];
float Final_pi = 0.0f;
void* returns[3];
if(argc == 0){
printf("No arguments supplied\n");
return -1;
}
if(argc > 2){
printf("There are too many arguments\n");
return -1;
}
args[0].mIterations = iterations;
args[0].mFirst_value = 1;
args[1].mIterations = iterations;
args[1].mFirst_value = 2;
args[2].mIterations = iterations;
args[2].mFirst_value = 3;
args[0].mSum = sum;
args[1].mSum = sum+1;
args[2].mSum = sum+2;
for(i = 0; i < thread_number; i++){
pthread_create(&thread_id[i], NULL, ComputePi, &args[i]);
args[i].mFirst_value = i + 1;
args[i].mIterations = iterations;
}
for(i = 0; i < thread_number; i++){
pthread_join(thread_id[i], &returns[i]);
args[i].mSum = (float*)returns[i];
printf("%f\n",*args[i].mSum);
}
/*Add the computations together*/
for(i = 0; i < thread_number; i++)
Final_pi += *args[i].mSum;
error = Pi - Final_pi;
print_result(sum, Final_pi, error);
return 0;
}
pi.c:
/*code in threads*/
void* ComputePi(void * data){
int i;
int sign = 1;
int denominator = 1;
float sum = 0.0f;
data_struct * args = (data_struct *)data;
if(args->mFirst_value == 1){
sign = 1;/*first number of the series*/
denominator = 1;
}
else if (args->mFirst_value == 2){
sign = (-1);/*second number of the series*/
denominator = 3;
}
else if(args->mFirst_value == 3){
sign = 1;/*Third number of the series*/
denominator = 5;
}
/*loop to compute one of the 3 numbers that added together give us Pi*/
for(i = args->mFirst_value; i <= args->mIterations; i = i+3){
sum += sign * 4.0f / denominator;
denominator += 6;
sign *= -1;
}
args->mSum = ∑
printf("mSum %f\n",*args->mSum);
return (void*)args->mSum;
}
driver.h:
void* ComputePi(void * data);
/*data_struct struct*/
typedef struct{
float * mSum;
int mIterations;
int mFirst_value;
}data_struct;
printf в теме дает мне фактические результаты, но тот, что в основном, просто печатает 03 раза.