Member 13540542 Ответов: 1

Пример многопоточной программы


Напишите многопоточную программу, которая вычисляет сумму списка чисел. Эта программа будет передана серия чисел (ровно 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 чисел, и это было легко, но часть (Б) хочет, чтобы я изменил часть (а), чтобы найти сумму нечетного и четного чисел я попытался решить его, но, кажется, я не могу изменить код, который я написал, чтобы найти решение части (б).
)

1 Ответов

Рейтинг:
6

OriginalGriff

Вам нужно создать два потока, каждый с другой задачей: один добавляет четные числа, один добавляет нечетные. Вам нужно будет добавить глобальную переменную и обеспечить блокировку, чтобы гарантировать, что два потока не попадут в беспорядок при ее использовании.
Вам также нужно будет предоставить сигнальный механизм, который получает основной поток для отображения текущего (пересмотренного) количества.

Честно говоря, если вы пытаетесь научиться программировать, находя примеры и пытаясь их выполнять, вы в значительной степени теряете свое время. Это все равно что пытаться научиться водить машину, угнав ее и выехав на автостраду не в ту сторону. Вы можете многому научиться, вы, вероятно, столкнетесь значительное количество раз, но вы не узнаете, как параллельно парковаться, или что делать на кольцевой развязке! И вы, конечно, не будете компетентным водителем, даже после нескольких десятков поездок...
Развитие - это то же самое: "учиться самостоятельно" просто означает, что вы понятия не имеете о том, чего не знаете, и многое из этого может значительно облегчить вашу работу. Возвращаясь к аналогии с автомобилем, предположим, что вы украли рычаг переключения передач / механическую коробку передач, но вы даже не знаете, что сцепление существует, а тем более что с ним делать. Обучение вождению из книги или лучше курса научит вас этим вещам - и научиться кодировать таким же образом также будет "заполнять пробелы" намного лучше.