[so] testerul considera corect un monitor gresit?

adrian nistor adriannistorrr at yahoo.com
Sun Dec 3 00:26:25 EET 2006



Cristi B <cristib84 at yahoo.com> wrote: Folosind testul public, am facut un print de genul "Oops deja era cineva in monitor" atunci cand un thread ar trebuii sa intre in monitor dar era deja cineva acolo(variabila active era 1 si eu incercam sa pun din nou 1)...
   
 <<<
 Nu as vrea sa iti cer un efort suplimentar de debug, dar:
 -Din ce mi-ai spus pot deduce doar ca daca exista o problema, 
     aceasta ar fi la planificarea unui thread din 
     EntryQueue. Doar din atata nu imi pot da seama
     care este problema si cu atat mai mult unde 
     e gresit testul.
   
 -Banuiesc ca atunci cand ai constatat problema, ai debugat 
     mai amanuntit zona aceea de cod(cu printf-uri 
     de exemplu). La acest gen de informatii suplimentare
     ma refeream in mailul anterior.
   
 Am sa dau un exemplu de informati care m-ar putea ajuta 
 in a debuga:
   
 La testul 3(Signal and Wait), cand iese din monitor
 al doilea din primele 3 threaduri apare problema. 
 Al doilea iese prin functia  IesireDinSignal3() 
 cazul    if(GetNrX()==1)
   
 Pe acest caz(GetNrX()==1), test("Verifica6",Verifica(1,1,0,1,0,0)==0);
 verifica corect , deci monitorul inca fucntioneaza corect. 
 DAR, imediat dupa, desi ar trebui sa deblochez doar al
 treilea fir din primele trei(singurul ramas acum in 
 Signallers Queue), monitorul meu il deblocheaza 
 pe acesta DAR si pe cel din EntryQueue(in mod gresit). 
 Cu toate acestea, testul nu sesizeaza greseala.
   
 (Eventual, daca nu e prea mult de cerut:::)Testul 
 nu sesizeaza greseala deoarece nu exista o functie 
 "test/Verifica" si dupa sleep-ul de pe ramura 
 if(GetNrX()==2)
   
 Poate la prima vedere descrierea de mai sus pare
 mult prea amanuntita. Dar cand ai debugat acea zona de cod, 
 cu siguranta ai obtinut astfel de informatii:
 -la ce test
 -la ce actiune a carui fir se intampla
 -pe ce ramura din ce functie
 -etcetc
 -cum ajung cele doua sa ruleze simultan(bugul din 
 monitorul tau).Daca sti functia si ramura
 (deci ce operatie facea monitorul atunci), probabil 
 ca poti sa iti dai seama de acest lucru.
 -eventual(daca nu e foarte greu):::de ce nu vede 
 testul acest lucru (bugul din test)
   
 De asemeni, un monitor este implmentat 
 corect doar daca a apelat corect functiile din 
 CallbackMonitor.h si CallbackRW.h. Probabil 
 ca tu le-ai apelat corect, dar poate ai putea sa 
 mai verifici o data acest aspect.
  
 De exemplu,  pentru o implementare
 in care cozile sunt reprezentate prin semafoare.
 Intrarea in coada SignallersQueue:
   
 IncSignal();
 sem_wait(&monitor->semaforSQ);
 DecSignal();
   
   
 Adica dupa ce ai apelat IncSignal,
 singurul lucru care il faci dupa este sa te 
 blochezi in coada. Dupa ce ai iesit din coada, primul lucru 
 care il faci este sa apelezi DecSignal
   
   
 Inca o data, sper sa nu reprezinte o sarcina 
 in plus pentru tine. Dar banuiesc ca:
 -informatiile de mai sus nu sunt greu de 
 obtinut(probabil ca deja le ai)
 -esti la fel de curios ca si mine sa afli daca si eventual unde 
 este testul gresit (eventual si unde este monitorul gresit).
 >>>
   
   
 
Oare trebuie sa protejez cu un mutex si monitorul ?(asta s-ar traduce prin inca o coada, adica dupa ce stau la cozile waiting, entry sa mai stea la inca o coada)
   
   
 <<<
 Nu. Monitorul ar trebui sa fie implementat astfel incat sa 
 nu aiba nevoie de obiecte de sincronizare suplimentare.
 >>>
   
 

adrian nistor <adriannistorrr at yahoo.com> wrote: Ai constatat acest lucru folosind testul public
 s-au testele tale? Ai putea te rog sa imi dai 
 mai multe amanunte despre conditiile in care 
 s-a intamplat acest lucru? 

Cristi B <cristib84 at yahoo.com> wrote:Am implementat monitorul dupa specificatiile din enunt si implementarea mea trece toate testele de monitor si readers&writers totusi:
am avut curiozitatea sa vad dc atunci cand se planifica un thread ptr executie daca mai exista un thread activ (adica vor fi 2 thread-uri care se executa in monitor) si surpriza, exista 2 threaduri care ruleaza in acelasi timp desi in enunt se specifica clar ca nu pot exista 2.
Unde gresesc? Oare testerul nu a verificat si asta ? Dc implementarea mea este gresita, mi se scade desi programul trece testele ?
    

---------------------------------
Everyone is raving about the all-new Yahoo! Mail beta._______________________________________________
so mailing list
so at cursuri.cs.pub.ro
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so

   

---------------------------------
Check out the all-new  Yahoo! Mail beta - Fire up a more powerful email and get things done faster._______________________________________________
so mailing list
so at cursuri.cs.pub.ro
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so

   

---------------------------------
Want to start your own business? Learn how on Yahoo! Small Business.

 
---------------------------------
Any questions?  Get answers on any topic at Yahoo! Answers. Try it now.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/so/attachments/20061202/b22a2831/attachment.htm


More information about the so mailing list