pthread sposoby synchronizacji watkow

0

witam
mam taki problem w z programem wykorzystujacym biblioteke pthread.h. Program mial symulowac rzut do kosza 3 zawodnikow. Obszarem wspoldzielonym miala byc zmienna kosz, w ktorej jest przechowywana informacja o zawodniku ktory rzuca. Problem z programem mam taki ze w jego obecnym ksztalcie dziala bardziej sekwencyjnie, niz rownolegle . Nie mam juz kompletnie pomyslu jak zrobic by kolejnosc rzucania nie wygladala tak 1,2,3,1,2,3 itd. Ponizej zamieszczam kod funkcji odpowiedzialnej za rzuty do kosza. Zawarlem miedzy muteksami blok odpowiedzialny za rysowanie toru lotu pilki do kosza. Mysalem ze jak uzyje muteksow, to watki ktorym przez to zablokuje dostep do zmiennej int beda sie "biły" o nia az do momentu zwolnienia jej przez trzeci watek i w momencie zwolnienia 1 z pozostalych dwoch go zajmie, ale nie koniecznie w kolejnosci w jakiej watki zostaly powolane do zycia. Bo obecnie wyglada to tak watek nr 1 blokuje, rysuje rzut, odblokowuje, watek nr 2 robi to samo , nastepnie watek nr 3 robi to samo i tak w kolko w tej samej kolejnosci

void *test(void* parametr) {

	struct zawodnik *zaw;
	zaw = (struct zawodnik *)parametr;
	int x1=zaw->x;
	int y1=zaw->y;
	int p;
	
	while(zaw->rzut<8){
		x1=zaw->x;
		y1=zaw->y;
	pthread_mutex_lock(&muteks);
	kosz=zaw->nr;
	
	if(kosz==zaw->nr) {
		while( (x1!=X || y1!=Y)) {
			if(zaw->nr==1)	mvwprintw(boisko,y1,x1++," 0");
			if(zaw->nr==2)	{ mvwprintw(boisko,y1,x1," "); mvwprintw(boisko,--y1,x1,"P"); }
			if(zaw->nr==3)	mvwprintw(boisko,y1,--x1,"L ");
			usleep(zaw->szybkosc*1000000/15);
			
			wrefresh(boisko);
		}
 	zaw->rzut++;	
	zaw->pkt++;
	}
	mvwprintw(boisko,3,40,"+");
	wrefresh(boisko);

	
	kosz=-1;
	pthread_mutex_unlock(&muteks);
	
	

	mvwprintw(boisko,3,40,"+");
	wrefresh(boisko);

	
	
	
	}
	return NULL; 

}
0

Mysalem ze jak uzyje muteksow, to watki ktorym przez to zablokuje dostep do zmiennej int beda sie "biły" o nia az do momentu zwolnienia
Dostęp jest kolejkowany dlatego zawodnik który rzuci idzie na koniec kolejki. Aby to zmienić możesz zamiast pthread_mutex_lock dać coś takiego:

while(!pthread_mutex_trylock(mutex)) usleep(50000);

czyli "dopóki nie ma dostępu do muteksa czekaj 0.05 sekundy". Żeby było jeszcze lepiej zamiast 0.05 sekundy możesz wrzucić jakąś wartość losową, lub użyć wartości przypisanej danemu zawodnikowi (im mniejsza tym częstszy dostęp do kosza).

1 użytkowników online, w tym zalogowanych: 0, gości: 1