Как я могу получить доступ к вычислениям, выполненным в потоке из основного? - PullRequest
0 голосов
/ 24 декабря 2018

Я практикую создание 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 = &sum;
  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 раза.

1 Ответ

0 голосов
/ 24 декабря 2018

mSum - это указатель на float.

Он устанавливается по адресу переменной sum, которая находится в стеке кадр ComputePi.Это выходит за рамки, когда ComputePi выходит / возвращается.

Измените mSum на float mSum и сделайте args->mSum = sum вместо args->mSum = &sum

Затем просто напечатайте args[i].mSum в main.

Обратите внимание, что есть и другие способы организовать это, но это самый простой.

...