//Melita Mihaljevic 0036411392
//Napisati program koji stvara zadani broj dretvi/procesa . Sve dretve/procesi trebaju obavljati isti posao:
//Posao_dretve(N){
//   za i=1 do N{
//      A=A+1;
//   }
//}
//Broj dretvi/procesa D i broj N se trebaju unijeti iz komandne linije (npr. program 2 10000) ili na pocetku izvodenja glavnog programa. Pocetna vrijednost 
//varijable A je 1. Kad sve dretve/procesi obave svoj posao, treba ispisati 
//vrijednost varijable A. U slucaju rada s procesima varijabla A mora biti pohranjena u zajednickoj memoriji.

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

int A=1; // globalna varijabla A kojoj pristupaju dretve

void * posao_dretve(void *n) {
	int i, div;
	int m = *((int *)n);
	for( i =1; i<=m; i++) {
		A = A +1;				// kriticni odsjecak u poslu dretve koji povecava globalnu varijablu A za 1 i vise dretvi joj ne smiju pristupati istovremeno
								// tu povecavam globalnu varijablu A pa to moram zasititi
	}
	div =A/ *((int*)n);
	printf("Dretva %d - A= %d\n", div, A);
}

// glavni program koji primabroj dretvi, i brij N
int main(int argc, char *argv[]) {
	int D, N, i, *polje;
	pthread_t thread;		
	D = atoi(argv[1]);
	N = atoi(argv[2]);

	// alociram memoriju za polje 
	if ((polje = (int *)malloc(D * sizeof(int) +1))== NULL) {
		fprintf (stderr, "Nema dosta memorije za polje od %d elemenata.\n", D+1);
		exit(1);
	}
	
	for (i =1; i < (int)D; i++) {
		*(polje +i) = N;
		if (pthread_create(&thread, NULL, posao_dretve, polje+i)!=0){  // pokretanje dretvi
			fprintf(stderr, "Greska pri stvaranju dretve %d\n",i);     // ukoliko je greska pri kreiranju dretve  izadji
			exit(1);
		}
	}

	while (pthread_join(thread,NULL) == 0);			// na kraju ceka da sve dretve zavrse 
	printf("Glavni program: A= %d\n",A);

	return 0;
}

