[so] Sincronizare

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Mon Apr 13 00:18:18 EEST 2009


On Sun, 2009-04-12 at 23:44 +0300, Bogdan Sass wrote:
> Razvan Deaconescu wrote: 
> > On Sun, 2009-04-12 at 23:10 +0300, Bogdan Sass wrote:
> >   
> > > Continuand cu tema2, incerc sa imi dau seama exact unde si cum este 
> > > nevoie de sincronizare.
> > > 
> > >     Fiind vorba de un singur server, operatiile server-side 
> > > (add/remove/clear) nu necesita sincronizare. In ceea ce priveste 
> > > operatiile print, am doua variante:
> > >     1) -iau semafoarele pe masura ce parcurg zona de memorie partajata, 
> > > si eliberez fiecare semafor imediat dupa afisarea unui bucket. Solutia 
> > > care imi blocheaza cel mai putin timp resursele, dar creez riscul unui 
> > > race-condition cu un client care modifica in acelasi timp un bucket.
> > >     
> > 
> > Nu vad unde este race condition-ul.
> > 
> >   
>     Eu afisez bucket-urile de la 0 la BUCKET_COUNT. In acelasi timp,
> un alt client scrie in bucket-ul X. In functie de momentul in care se
> produc cele 2 actiuni, eu pot sa afisez bucket-ul X asa cum arata
> inainte, sau dupa modificarea realizata de celalalt client.
>    
>     M-am exprimat eu gresit cand am considerat situatia respectiva un
> "race condition"?

Ceea ce spui tu aici este asa:
* se fac doua alocari de memorie:
   alfa = malloc(...)
   beta = malloc(...)
* thread-ul 1 acceseaza zona alfa
* thread-ul 2 acceseaza zona beta
* avem conditie de cursa

Nu exista nici o legatura directa intre cele doua zone (in cazul tau
bucket-uri) deci nu exista conditie de cursa. Elementele sunt disjuncte.
Functia de printare nu trebuie sa fie atomica la nivelul intregului set
de cuvinte. Daca ar fi asa ar insemna sa tii lock pe o regiune foarte
mare de memorie, ceea ce nu este eficient.

Razvan



More information about the so mailing list