#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
, что заставило меня подумать .
, что она не работает.