Semaforas (programavimas)

Semaforas – struktūra, turinti ją sukuriant nustatytą leidimų skaičių vykdymo gijoms dirbti su saugoma duomenų struktūra ar vykdyti saugomą kodo sekciją.

Semaforai naudojami, kuomet pageidaujama, jog su tam tikra duomenų struktūra ar kompiuterio įrenginiu nedirbtų daugiau nei nurodytas ribotas skaičius lygiagrečių gijų.

Kiekviena gija, prieš tai darydama, turi gauti iš semaforo leidimą (kviesdama semaforo leidimo pasiėmimo metodą), o baigusi darbą su saugomu objektu – leidimą grąžinti (kviesdama leidimo grąžinimo metodą). Jei semafore daugiau šiuo metu leidimų nebėra (jo likusių leidimų skaitiklis lygus nuliui), leidimo prašanti gija blokuojama kol kokia nors kita gija anksčiau pasiimtą leidimą grąžins.

Jei semaforas turi tik vieną leidimą, jo darbas daug nesiskiria nuo užrakto. Tačiau, skirtingai nuo užraktų, semaforai paprastai leidžia grąžinti leidimą ir ne tai gijai, kuri jį pasiėmė. Tai gali būti reikalinga, pavyzdžiui, išsprendžiant kai kuriuos sinchronizacijos aklavietės atvejus. Tačiau šiai galimybei reikalingi sinchronizavimo veiksmai gali sąlygoti lėtesnį darbą nei naudojant užraktus.

Skirtingai nuo užraktų, semaforai neskirti pakartotinam rakinimui ta pačia gija bei atskiriems rakinimams skaitymui bei rašymui.

Kaip ir užraktas, semaforas gali būti garbingas () arba ne. Garbingas semaforas pirmiausia suteikia leidimą tai gijai, kuri jo laukė ilgiausiai. Garbingo semaforo kodas yra sudėtingesnis ir vykdomas ilgiau, todėl naudoti jį verta ne visada.

Literatūra 
 Java dokumentacija apie semaforus, anglų kalba.

Programavimas