[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