[so] vesti bune
Cosmin Arad
so@atlantis.cs.pub.ro
Tue, 25 Nov 2003 10:01:16 -0800 (PST)
Nu trebuie sa fii ingrijorat. Hai sa lamurim
lucrurile:
- aloci un index in TLS la monitor_create;
- la monitor_enter daca valoarea lui e NULL, aloci o
zona unde sa tii informatia, sau pur si simplu setezi
pointerul la alta valoare diferita de NULL pt ca tot
ce ai tu nevoie e o info booleana (NULL vs NOT NULL
could do it).
- daca la enter nu era NULL inseamna ca threadul era
deja in monitor deci oops.
- la leave setezi pointerul la NULL (si faci free in
cazul in care ai alocat ceva acolo)
- la signal, wait, broadcast testezi pointerul sa nu
fie NULL.
- la destroi eliberezi indexul.
Ai garantia ca la alocarea indexului in TLS valoarea
lui e NULL in toate threadurile atat in Windows cat si
in Linux. Iti citez din documentatie:
-Windows (PSDK): "If the function succeeds, the return
value is a TLS index. The slots for the index are
initialized to zero." e vb de TlsAlloc.
-Linux (man pthread_key_create): "The value initially
associated with the returned key is !NULL! in all
currently executing threads."
Cosmin
--- Andrei Hagiescu <andrei.hagiescu@mymail.ro> wrote:
> Nu pare bine nici asa. Daca un thread este deschis
> inainte de crearea
> TLS-ului (deci de pornirea acelui monitor) nu are
> cine sa initializeze acel
> spatiu de stocare decat daca monitorul ar sti ce
> thread-uri sunt in proces.
> Presupunand ca avem incredere ca Windows
> initializeaza acel spatiu cu NULL
> (ceea ce nu stiu daca e valabil si in Linux) ar mai
> fi o problema daca acel
> TLS a fost folosit in prealabil in thread-ul nostru
> de catre altcineva
> (totusi monitorul va putea fi folosit in orice
> aplicatie) care nu l-a lasat
> cu NULL cand l-a eliberat.
__________________________________
Do you Yahoo!?
Protect your identity with Yahoo! Mail AddressGuard
http://antispam.yahoo.com/whatsnewfree