Доступ к полю результата из элементов массива структур после завершения выполнения потока

#c #multithreading #struct

#c #многопоточность #структура

Вопрос:

Целью программы является определение среднего значения из 12 чисел с плавающей запятой с использованием потоков.

Идея состоит в том, чтобы использовать потоки и заставить каждый поток выполнять одинаковый объем вычислений для получения результата.

Я планировал иметь 6 потоков, каждый из которых добавлял 2 числа с плавающей запятой. Как только все потоки будут завершены, сложите все результаты вместе, main а затем разделите на 12.

Я создаю struct вызываемый args , который передает 2 числа в поток. И другое поле, которое будет содержать результат этого добавления, чтобы предоставить результат для использования main .

Кажется, я не могу получить доступ к result полю из каждого struct внутри subsetsOfNumbers массива.

Ошибка:

 error: member reference type 'struct args' is not a pointer; did you mean to use '.'?
    totalSum  = subsetsOfNumbers[thread]->resu<
                ~~~~~~~~~~~~~~~~~~~~~~~~^~
                                        .
1 error generated.
  

Программный код:

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

int thread_count = 6;

struct args {
    float firstNumber;
    float secondNumber;
    float resu<
};

void *child_add(void *input) {

  struct args *data=((struct args*)input);

  float firstNumber = data->firstNumber;
  float secondNumber = data->secondNumber;

  data->result = firstNumber   secondNumber;

  return NULL;
}


int main() {

  long thread;
  pthread_t *thread_handles; // array of pthread structures
  struct args *subsetsOfNumbers; // array of args structures

  float numbers[12] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0};
  int index = 0;

  thread_handles = malloc(thread_count * sizeof(pthread_t));
  subsetsOfNumbers = malloc(thread_count * sizeof(struct args));

  for (thread = 0; thread < thread_count; thread  ) {
    struct args *subsetOfNumbers = (struct args *)malloc(sizeof(struct args));
    subsetOfNumbers->firstNumber = numbers[index  ];
    subsetOfNumbers->secondNumber = numbers[index  ];
    subsetsOfNumbers[thread] = *subsetOfNumbers;

    pthread_create(amp;thread_handles[thread], NULL, child_add, (void *) subsetOfNumbers);
  }

  float totalSum = 0;

  for (thread = 0; thread < thread_count; thread  ) {
    void *partialSum;
    pthread_join(thread_handles[thread], NULL);
    totalSum  = subsetsOfNumbers[thread]->resu<
  }

  float average = total / 12.0;

  free(thread_handles);
  return 0;
}

  

Комментарии:

1. Это сообщение об ошибке сообщает вам, что вы делаете неправильно, что в этом сбивает с толку?

2. Что такое subsetsOfNumbers ? Если это указатель (по сути, динамический «массив» args структур), то что это subsetsOfNumbers[thread] ?

3. subsetsOfNumbers это «динамический «массив» структур args)», как вы говорите. subsetsOfNumbers[thread] присваивает каждому элементу массива новый struct args экземпляр

4. Получается использование . вместо -> work . Я получил другую ошибку, используя . из-за того, что функция child_add была объявлена в отдельном файле duplicate symbols , что заставило меня подумать . , что она не работает.

5. OT: относительно: float numbers[12] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}; Массив объявлен как тип float , однако фактические литеральные значения имеют тип double . Предложение: float numbers[12] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f}; обратите f внимание на завершение каждого литерала с плавающей запятой

Ответ №1:

Как следует из ошибки:

 totalSum  = subsetsOfNumbers[thread].resu<
  

Сработало.

Я получил другую ошибку, используя . из-за того, что функция child_add была объявлена в отдельном файле duplicate symbols , что заставило меня подумать . , что она не работает.