Пример многопоточной программы
Напишите многопоточную программу, которая вычисляет сумму списка чисел. Эта программа будет передана серия чисел (ровно 5 чисел) в командной строке во время выполнения и затем создаст один рабочий поток, который найдет сумму 5 значений, в то время как родительский поток выведет (напечатает) значение суммы после выхода рабочего потока. Переменная, представляющая сумму, будет храниться глобально. Например, предположим, что ваша программа передает целые числа: 7 8 9 10 11 программа покажет следующий результат: сумма равна 45.
и я решил что поставлю ответ в последнюю но часть 2 примера я не могу его понять и не могу решить пожалуйста помогите:
Modify your code in part (a) by dividing the sum job between two threads. Each thread will be passed the 5 numbers, then the first thread will sum up the even numbers only (i.e. 8 and 10 in the previous example), while the second thread will sum up the odd numbers (i.e. 7, 9, 11 in the previous example). The summation is being done on the same sum global variable. Another global variable called counter is used to count the numbers (even or odd) that have been summed up. The value of counter is incremented and then printed out every time a number (even or odd) is added to the sum variable. The parent thread will output (print) the final sum value and the final counter value once the worker threads have exited. The program will show the following output for the previous example (note that TN is either 1 or 2) : The counter value is 1 and incremented by thread TN
Что я уже пробовал:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <errno.h> /*Error handling for pthread_create and pthread_join*/ /*from the pthread_create man page*/ #define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) /* # of running threads */ volatile int running_threads = 0; pthread_t thread[1]; /*Descriptors for our 3 threads*/ int numOfElements;/*Total # of elements from the user*/ struct Results{ /*Struct to hold the statistical results*/ int sum; }Results; /*This function finds the average of an array*/ void *findsum(void *array_ptr){ int i; /*counter*/ int *elements = (int*)array_ptr; /*re reference void array pointer*/ for(i = 0; i < numOfElements; i++){ /*iterate through array*/ Results.sum += elements[i]; /*add element @ i to average*/ } running_threads -= 1; /*Decrement running threads counter*/ return NULL; } /* This method accepts a int n(initial size of array) and pointer to an array and returns # of elements in the array */ int getArrayInput(int n, int *array_ptr){ int input;/*Store user input */ int numberOfElements = 0;/*Number of Integers inputed*/ printf("Creating Dynamic Array...\n-\n"); for(;;){ /*infinite loop*/ printf("Enter a positive value:\nNegative Number to Stop\n-\n"); //Get Int from console, store at address of input if (scanf("%d",&input) != 1){ printf("\nOops that wasn't an Integer\nlets try filling the array again\nRemember INTEGERS only!\n"); exit(EXIT_FAILURE); } if (input >= 0){ if (numberOfElements == n){ n += 1; //Make room for the current input array_ptr = realloc(array_ptr, n * sizeof(int));//realloc array and set pointer } array_ptr[numberOfElements++] = input;//Store input at next empty element } else { printf("\nNumber of Integers: %d\n", numberOfElements); break; } } return numberOfElements; } /*This function creates the 3 threads we need and supplys error catching for pthread_create, it could be modified easily to create any # of threads automatically */ void createThreads(int *array_ptr){ int s; /*error #*/ /*Create a thread and passing in the function to begin exectuing as well as that functions required arguments*/ /*Create a thread and passing in the function to begin exectuing as well as that functions required arguments*/ s = pthread_create(&thread[2], NULL, findsum, (void *)array_ptr); if (s != 0){ handle_error_en(s, "pthread_create"); } running_threads += 1; } /* The main function initialiazes the dynamic array as well as allocating space for it, Then it creates, using pthread_create, 1 threa to calculate the min, */ int main(){ int n = 1; /* Initial Array Size*/ int *array_ptr = malloc(n * sizeof(int));/*Initialize array pointer*/ /*get an n sized array of elements from the user and save count*/ numOfElements = getArrayInput(n, array_ptr); createThreads(array_ptr); while(running_threads>0){ /*Wait for each thread to decrement*/ sleep(1); } /*Prompt the user with our results*/ printf("\nThe sum is %d\n",Results.sum); return(0); }
OriginalGriff
Чего ты не понимаешь? Это довольно ясно - может быть, вам стоит поговорить со своим наставником?
Member 13540542
как я могу изменить свой код для выполнения части в
у меня нет репетитора, я учусь Один дома этот вопрос был примером, который я нашел, и я попытался решить я решил часть (а), чтобы найти сумму 5 чисел, и это было легко, но часть (Б) хочет, чтобы я изменил часть (а), чтобы найти сумму нечетного и четного чисел я попытался решить его, но, кажется, я не могу изменить код, который я написал, чтобы найти решение части (б).
)