Multumesc frumos Razvan pt raspuns!<br><br><b><i>Razvan Deaconescu <razvand@cs.pub.ro></i></b> wrote:<blockquote class="replbq" style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"> On Tue, 2007-12-04 at 03:48 -0800, Vlad Ionita wrote:<br>> Salutari,<br>> <br>> Imi poate explica si mie cineva ce inseamna parametrul ala X<br>> din prototipul functiei Verifica din ControlMonitor.c<br>> <br>> Adica primele e, s, w, q00, q11 m-am prins de la ce vin, dar<br>> X-ului aluia nu ii dau de cap.<br>> <br>> Si inca una mica,<br>> Vad ca apar in ControlMonitor.c si functiile IncNrX si DecNrX.<br>> Trebuie si astea inserate in sursa noastra?<br><br>Salut, Vlad!<br><br>Argumentele reprezinta respectiv:<br><br>e - numarul de thread-uri din EntryQueue<br>s - numarul de thread-uri din signaller queue (valabil doar la<br>SIGNAL_AND_WAIT)<br>w - numarul de thread-uri din waiting queue (valabil doar
la<br>SIGNAL_AND_CONTINUE)<br>x - numarul de thread-uri care au trecut printr-o faza in care urmeaza a<br>parasi monitorul (in exemplul de mai jos se foloseste in<br>IesireDinSignal3) (folosite _doar_ intern; nu trebuie sa folositi IncNrX<br>sau DecNrX in biblioteca voastra)<br>q00 - numarul de thread-uri care asteapta la variabila conditie 0<br>q11 - numarul de thread-uri care asteapta la variabila conditie 1<br><br>Ca sa te lamuresc voi considera testul 3 din suita de teste: Test3.c:<br><br>* in functia Test3 se creeaza 4 thread-uri: a, b, c, d<br>* se folosesc sleep-uri pentru a "garanta" faptul ca thread-ul c intra<br>in monitor dupa thread-ul a si b, iar thread-ul d intra in monitor dupa<br>thread-ul c (in functiile FunctieC, respectiv FunctieD dinainte de<br>Enter(m)<br><br>* a si b vor intra in monitor (nu conteaza ordinea) si vor astepta<br>respectiv la conditia 1 si conditia 2 (Wait)<br>* thread-ul c intra in monitor si apeleaza functia Verifica (cu<br>argumentul
"Verifica1"); functia se apeleaza dupa ce thread-ul d a ajuns<br>sa astepte intrarea in monitor; argumentele sunt 1,0,0,0,1,1 (1 - un<br>thread in EntryQueue - este vorba de d, nimic in SQ, nimic in WQ, nimeni<br>nu a trecut prin functia IesireDinSignal3, thread-ul b asteapta la q00,<br>thread-ul c asteapta la q11)<br><br>* thread-ul c trezeste thread-ul b (Signal(m, 0)); thread-ul b este<br>trezit iar thread-ul c intra in SQ<br>* thread-ul b apeleaza functia Verifica ("Verifica2") cu argumentele<br>1,1,0,0,0,1 adica thread-urile d,c,0,0,0,a (d in EQ, c in SQ, a in coada<br>lui q11)<br><br>* thread-ul b trezeste thread-ul a (Signal(m,1)); thread-ul a este<br>trezit iar thread-ul b intra in SQ<br>* thread-ul a apeleaza functia Verifica ("Verifica3") cu argumentele<br>1,2,0,0,0,0 adica thread-urile d,b+c,0,0,0,0<br><br>* thread-ul a asteapta la q11 (din nou); este trezit un thread din SQ<br>(nu conteaza cine dintre b si c deoarece vor urma acelasi cod -
apelare<br>IesireDinSignal3; presupunem thread-ul b)<br>* thread-ul b apeleaza IesireDinSignal3<br>* intra pe ramura GetNrX () == 0<br>* apeleaza Verifica ("Verifica4") cu argumentele 1,1,0,0,0,1 adica<br>d,c,0,0,0,a<br><br>* incrementeaza x<br>* trezeste thread-ul a si intra in SQ<br>* thread-ul a apeleaza Verifica ("Verifica5") cu argumentele 1,2,0,1,0,0<br>adica d,b+c,0,b was here,0,0<br>* thread-ul a paraseste monitorul; este planificat un thread din SQ; din<br>nou nu conteaza care din b si c; presupunem tot b<br><br>* b intra pe ramura GetNrX() == 1<br>* b apeleaza Verifica ("Verifica6") cu argumentele 1,1,0,1,0,0 adica<br>d,c,0,b was here,0,0<br>* b incrementeaza x<br>* b paraseste monitorul; este planificat un thread din SQ (c)<br><br>* c intra pe ramura GetNrX() == 2<br>* c apeleaza Verifica ("Verifica7") cu argumentele 1,0,0,2,0,0 adica<br>d,0,0,b was here twice,0,0<br>* c incrementeaza x<br>* c paraseste monitorul; este planificat d (din EQ)<br><br>* d intra in
monitor (Functie3D)<br>* d apeleaza Verifica ("Verifica8") cu argumentele 0,0,0,3,0,0 adica<br>0,0,0,b was here twice + c was here,0,0<br>* d apeleaza Signal fara nici un efect (nu se intampla nimic) - se<br>verifica faptul ca un Signal pe o conditie la care nu asteapta nici un<br>alt thread nu are nici un efect<br>* d apeleaza Verifica ("Verifica9") cu argumentele 0,0,0,3,0,0 (acelasi<br>ca mai sus)<br>* d paraseste monitorul<br><br>Toate thread-urile au trait fericite pana la adanci batraneti :-)<br><br>Razvan<br><br>_______________________________________________<br>so mailing list<br>so@cursuri.cs.pub.ro<br>http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so<br></blockquote><br><p> 
<hr size=1>Get easy, one-click access to your favorites.
<a href="http://us.rd.yahoo.com/evt=51443/*http://www.yahoo.com/r/hs"> Make Yahoo! your homepage.</a>