[so] [tema 3 linux] Testare
Cosmin Arad
so@cursuri.cs.pub.ro
Tue, 30 Nov 2004 20:14:39 +0200
> Salut,
> Cum trebuie sa se comporte programele care le face pentru test.
> La readers-writers de exemplu, eu am pus doua define-uri in cod
> pentru numarul de scriitori si cititori si afisez la stdout mesaje
> de genul:
>
> Reader 4 reads something from sared memory
> Reader 4 finished reading
> Writer 1 calls Broadcast on readers
> ...
>
> E bine?
Testarea monitorului o sa fie facuta cu un program separat. Pentru asta e
important ca biblioteca sa exporte exact numele de functii din enunt.
Pentru testarea celor 2 programe va trebui sa faceti voi apeluri catre niste
functii care vor verifica invariantii din enunt in anumite momente cheie.
Mai precis, includeti in sursele celor 2 probleme headerul test3.h in care
definiti umatoarele functii:
need_to_read(pthread_t tid) {}
need_to_write(pthread_t tid) {}
started_reading(pthread_t tid) {}
started_writing(pthread_t tid) {}
ended_reading(pthread_t tid, int value) {}
ended_writing(pthread_t tid, int value) {}
client_entered_barbershop(pthread_t tid) {}
client_left_barbershop(pthread_t tid) {}
client_started_waiting(pthread_t tid) {}
client_ended_waiting(pthread_t tid) {}
client_started_haircut(pthread_t barber_tid, pthread_t client_tid) {}
client_ended_haircut(pthread_t barber_tid, pthread_t client_tid) {}
barber_started_haircut(pthread_t barber_tid, pthread_t client_tid) {}
barber_ended_haircut(pthread_t barber_tid, pthread_t client_tid) {}
barber_started_sleeping(pthread_t tid) {}
barber_ended_sleeping(pthread_t tid) {}
Va trebui sa apelati aceste metode in punctele in care ele au sens. Testul va
contine implementarea lor care va contabiliza situatia in care se afla
threadurile si va verifica invariantii.
> La sleeping barber frizerul care e trezit simuleaza tunsul printr-un
> sleep,nu? Dar clientul poate termina imediat ce a inceput sa fie tuns?
> Cu alte cuvinte, clientul poate afisa doar "A barber starts to cut my hair"
> sau trebuie si "I have a new haircut now". Problema cu afisarea celui de-al
> doilea mesaj e ca el va stii doar ca un frizer il tunde nu si care
> dintre ei,
> deci ar fi greu sa-si dea seama cand s-a terminat tunsul. Sper ca am fost
> suficient de clar...
Fiecare client trebuie sa stie care frizer il tunde. Ei trebuie sa se
sincronizeze atat cand incepe tunsul cat si cand se termina. Presupunand ca un
tuns _nu_ dureaza un timp constant fiecare trebuie sa stie cand s-a terminat
tunsul. Ia in considerare urmatorul exemplu: Un frizer tunde "repede" 3 clienti.
Daca clientii "cred" ca tunsul a durat "mai mult", ei tin scaunul ocupat insa
frizerul se anunta liber si mai tunde si pe altii. Practic la un moment ai mai
multi clienti pe scun ceea ce e imposibil. Pentru corectitudine, punctele de
vedere ale clientului si frizerului relativ la sfarsitul tunsului trebuie sa
coincida.
> Si inca o intrebare: pentru identificarea threadurilor am folosit
> pthread_self() si abia apoi am observat precizarea cu TSD. Este gresit daca
> folosim pthread_self?
Poti sa ai mai multe threaduri in asteptare la cozile monitorului. Daca faci cu
pthread_self() va trebui sa tii intr-o lista toate IDurile lor, deci la un test
ai o cautare O(n).
Daca fiecare thread isi tine informatia in TSD/TLS ai o cautare O(1).
Eu iti recomand sa folosesti TSD, e foarte simplu.
Cosmin