This is an old revision of the document!


Laboratorul 06 - Structuri și operații atomice în Java

Responsabili: Radu Ciobanu, Carina Deaconu, Florin Mihalache

Semafoare (continuare)

Laboratorul trecut, am văzut cum semaforul reprezintă o generalizare a unui mutex. Un semafor iniţializat cu 1 poate fi folosit drept lock, pentru că doar un thread are acces la zona critică la un moment de timp. Totuși, un semafor poate avea întrebuinţări mult mai complexe, deoarece poate lua diverse valori, atât negative, cât şi pozitive.

Când un semafor este iniţializat cu valoarea pozitivă x, vă puteţi gândi că x thread-uri au voie să intre în secţiunea critică. Pe măsură ce un thread face acquire(), x este decrementat. Când se ajunge la 0, alte posibile thread-uri care vor să acceseze regiunea critică vor trebui să aştepte până când valoarea semaforului creşte la o valoare pozitivă (adică până când iese câte un thread din cele aflate în regiunea critică).

Complementar, când un semafor este iniţializat cu o valoare negativă cum ar fi -1, se aşteaptă ca cel puţin două thread-uri să facă întâi release() (pentru ca valoarea semaforului să crească de la -1 la 1), înainte ca o regiune critică să poată fi accesată (adică un alt thread să poată face acquire()). Vă puteţi imagina că un al treilea thread aşteaptă „la semafor” ca alte două thread-uri să îi dea un semnal prin apelul release() când şi-au „terminat treaba”. Puteți observa un exemplu în pseudocodul de mai jos.

T0 T1 T2
x
x
x x
apd/laboratoare/06.1605269997.txt.gz · Last modified: 2020/11/13 14:19 by florin.mihalache
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0