[so] Parametrii functie de verificare

Razvan Deaconescu razvand at cs.pub.ro
Tue Dec 4 17:27:27 EET 2007


On Tue, 2007-12-04 at 03:48 -0800, Vlad Ionita wrote:
> Salutari,
> 
> Imi poate explica si mie cineva ce inseamna parametrul ala X
> din prototipul functiei Verifica din ControlMonitor.c
> 
> Adica primele e, s, w, q00, q11 m-am prins de la ce vin, dar
> X-ului aluia nu ii dau de cap.
> 
> Si inca una mica,
> Vad ca apar in ControlMonitor.c si functiile IncNrX si DecNrX.
> Trebuie si astea inserate in sursa noastra?

Salut, Vlad!

Argumentele reprezinta respectiv:

e - numarul de thread-uri din EntryQueue
s - numarul de thread-uri din signaller queue (valabil doar la
SIGNAL_AND_WAIT)
w - numarul de thread-uri din waiting queue (valabil doar la
SIGNAL_AND_CONTINUE)
x - numarul de thread-uri care au trecut printr-o faza in care urmeaza a
parasi monitorul (in exemplul de mai jos se foloseste in
IesireDinSignal3) (folosite _doar_ intern; nu trebuie sa folositi IncNrX
sau DecNrX in biblioteca voastra)
q00 - numarul de thread-uri care asteapta la variabila conditie 0
q11 - numarul de thread-uri care asteapta la variabila conditie 1

Ca sa te lamuresc voi considera testul 3 din suita de teste: Test3.c:

* in functia Test3 se creeaza 4 thread-uri: a, b, c, d
* se folosesc sleep-uri pentru a "garanta" faptul ca thread-ul c intra
in monitor dupa thread-ul a si b, iar thread-ul d intra in monitor dupa
thread-ul c (in functiile FunctieC, respectiv FunctieD dinainte de
Enter(m)

* a si b vor intra in monitor (nu conteaza ordinea) si vor astepta
respectiv la conditia 1 si conditia 2 (Wait)
* thread-ul c intra in monitor si apeleaza functia Verifica (cu
argumentul "Verifica1"); functia se apeleaza dupa ce thread-ul d a ajuns
sa astepte intrarea in monitor; argumentele sunt 1,0,0,0,1,1 (1 - un
thread in EntryQueue - este vorba de d, nimic in SQ, nimic in WQ, nimeni
nu a trecut prin functia IesireDinSignal3, thread-ul b asteapta la q00,
thread-ul c asteapta la q11)

* thread-ul c trezeste thread-ul b (Signal(m, 0)); thread-ul b este
trezit iar thread-ul c intra in SQ
* thread-ul b apeleaza functia Verifica ("Verifica2") cu argumentele
1,1,0,0,0,1 adica thread-urile d,c,0,0,0,a (d in EQ, c in SQ, a in coada
lui q11)

* thread-ul b trezeste thread-ul a (Signal(m,1)); thread-ul a este
trezit iar thread-ul b intra in SQ
* thread-ul a apeleaza functia Verifica ("Verifica3") cu argumentele
1,2,0,0,0,0 adica thread-urile d,b+c,0,0,0,0

* thread-ul a asteapta la q11 (din nou); este trezit un thread din SQ
(nu conteaza cine dintre b si c deoarece vor urma acelasi cod - apelare
IesireDinSignal3; presupunem thread-ul b)
* thread-ul b apeleaza IesireDinSignal3
* intra pe ramura GetNrX () == 0
* apeleaza Verifica ("Verifica4") cu argumentele 1,1,0,0,0,1 adica
d,c,0,0,0,a

* incrementeaza x
* trezeste thread-ul a si intra in SQ
* thread-ul a apeleaza Verifica ("Verifica5") cu argumentele 1,2,0,1,0,0
adica d,b+c,0,b was here,0,0
* thread-ul a paraseste monitorul; este planificat un thread din SQ; din
nou nu conteaza care din b si c; presupunem tot b

* b intra pe ramura GetNrX() == 1
* b apeleaza Verifica ("Verifica6") cu argumentele 1,1,0,1,0,0 adica
d,c,0,b was here,0,0
* b incrementeaza x
* b paraseste monitorul; este planificat un thread din SQ (c)

* c intra pe ramura GetNrX() == 2
* c apeleaza Verifica ("Verifica7") cu argumentele 1,0,0,2,0,0 adica
d,0,0,b was here twice,0,0
* c incrementeaza x
* c paraseste monitorul; este planificat d (din EQ)

* d intra in monitor (Functie3D)
* d apeleaza Verifica ("Verifica8") cu argumentele 0,0,0,3,0,0 adica
0,0,0,b was here twice + c was here,0,0
* d apeleaza Signal fara nici un efect (nu se intampla nimic) - se
verifica faptul ca un Signal pe o conditie la care nu asteapta nici un
alt thread nu are nici un efect
* d apeleaza Verifica ("Verifica9") cu argumentele 0,0,0,3,0,0 (acelasi
ca mai sus)
* d paraseste monitorul

Toate thread-urile au trait fericite pana la adanci batraneti :-)

Razvan



More information about the so mailing list