Uvod
Obična barijera (primjer) ima sučelja:
bar_init(B, N)koja inicijalizira barijeruBzaNdretvibar_wait(B)koju poziva dretva- poziv blokira dretvu ako to nije zadnja
N-takoja je došla na barijeru - ne blokira dretvu ako je to zadnja
N-takoja je došla na barijer, ali pritom odblokira svihN-1dretvi koje su već blokirane; također "resetira" barijeru za idući korak
- poziv blokira dretvu ako to nije zadnja
početna dretva prije stvaranja novih: bar_init(B, N) inicijaliziraj sve ostalo stvori dretve radna dretva (I): petlja x = uzmi_dio_problema(I) y = generiraj_rješenje(x) bar_wait(B)
Zadatak
Ideja proširenja jest da se proširi semantika
bar_wait() na način da on ne blokira uvijek.
Naime, ako ostale dretve još nisu gotove i ova bi možda mogla iskoristiti još vremena za pronalazak boljeg rješenja.
petlja x = uzmi_dio_problema(I) (y, k) = generiraj_početno_rješenje(x) //k=0 nije još optimalno, k=1 optimalno je dok je (bar_wait(B, k) != 0) (y, k) = optimiraj(x, y, k)Poziv
bar_wait(B, k):
- jednak prethodnom ako je
k = 1(i vrati 0 nakon odblokiranja) - kada je
k = 0:- ako je na barijeri već
N-1dretva (sve čekaju!), onda je korak gotovo, sve pusti i vrati 0 - ako je do barijere već došlo već
N-1dretvi (sve su izračunale bar početno rješenje, ali neke možda još optimiraju svoje), onda blokiraj ovu dretvu i pri odblokiranju vrati joj 0 - ako do barijere nisu došle sve dretve, onda zapamti da je ova izračunala početno rješenje, ali ne blokiraj ovu dretvu već vrati 1
- ako je na barijeri već
mutex_lock, cond_wait, ...).
Primjerima pokazati rad programa. Koristiti prave dretve, ne simulirati.