Lygiagretusis programavimas: Skirtumas tarp puslapio versijų

Ištrintas turinys Pridėtas turinys
Monro (aptarimas | indėlis)
Knutux (aptarimas | indėlis)
Nėra keitimo santraukos
Eilutė 11:
Neatsargiai naudojamos kritinės sekcijos gali sulėtinti sistemos darbą. Pagreitinti programą galima atsisakius perteklinių kritinių sekcijų, jas supaprastinus iki minimumo, kad joje procesas užtruktų tik tiek, kiek reikia informacijos apsikeitimui ir apsaugojimui.
 
Kritinių sekcijų apsaugai yra sukurta daug priemonių. Bene pirmoji sukurta - [[semaforas. Semaforais saugoti kritines sekcijas nepatartina, nes jie dažniausiai išsimėto po programos kodą ir paskui būna rasti klaidas, juo labiau kad derinti (debug)lygiagretusis programas su daug lygiagrečių procesų ar gijų (threadprogramavimas) yra labai sunku|semaforas]].
 
 
==Kritinių sekcijų pavyzdžiai==
Paateikiami keli pavyzdžiai [[Java (kalba)|Java kalba]]. Pirmame pavyzdyje kritinė sekcija nenaudojama (rezultatas - nenuspėjamas):
Kaip sakoma, kol savo akimis nepamatai, nepatiki. Taigi paruošėme pavyzduką, kurį kiekvienas norintis gali išbandyti - tereikia Java kompiliatoriaus ir virtualio mašinos. Taigi pirmas atvejis - kritinė sekcija nesaugoma.
 
package testas;
eilutė 37 ⟶ 36:
}
}
class Gija2 extends Thread {
private long pradzia;
Eilutė 48:
}
}
public class Testas {
public static void main(String[] args) {
eilutė 57 ⟶ 58:
}
 
Šiek tiek pakoregavus, gaunamas kodas, kuriame naudojamos kritinės sekcijos:
 
Paleidę galime įsitikinti, kad metodai gali įsiterpti vienas į kitą ir taip gauname netikėtus rezultatus. Monitorių galime panaudoti taip:
 
 
...
eilutė 67 ⟶ 66:
...
 
Šiuo atveju kritinė sekcija apsaugo vietas, kurios gali būti keičiamos kelių gijų vienu metu, taigi rezultatai tampa nuspėjamais.
 
Išbandę matome, kad dabar jau monitoriai apsaugo kritinę sekciją ir metodai vienas į kitą neįsiterpia.
 
[[Category:Informatika]]