PDA

View Full Version : [C/WIN32 API] TlsFree


tuccio`
04-01-2011, 03:30
Allora, sto seguendo un corso di programmazione di sistema in cui si studiano in particolar modo le api di windows e ho un po' di perplessità riguardo la TlsFree

Citando dal libro di J. M. Hart "Win32 System Programming"
Normal global storage is shared by all threads. Although no thread can access another thread’s TLS, any thread can call and destroy an index for all threads, so use TlsFree carefully

e c'è anche un disegnino esplicativo in cui si dice che si può vedere il TLS come una matrice che è indicizzata sulle righe da una "chiave" e sulle colonne dall'id del thread, in cui ogni alloc riempie una cella vuota nella colonna corrispondente al thread chiamante e ogni free cancella l'intera riga della chiave corrispondente

Quindi se ad esempio in una DLL chiamo

DWORD index = TlsAlloc();
// faccio quello che devo fare
TlsFree(index);


Rischio di liberare tutti i TLS con indice "index" di tutti i thread che stanno usando la dll, no? Quindi bisogna stare attenti a quando si fa TlsFree, ok.. ma quando si può fare?

MSDN dice:

It is expected that DLLs call this function (if at all) only during DLL_PROCESS_DETACH.

ma ancora, se un processo ha caricato 2 dll che usano il TLS e che hanno un indice in comune.. se faccio TlsFree di quell'indice quando una di queste due dll viene liberata (FreeLibrary "innesca" il DLL_PROCESS_DETACH, no?) viene liberato anche il TLS dell'altra, no?

Forse qualcosa mi sfugge.. quand'è che posso usare TlsFree? (o non lo faccio e basta?)

tuccio`
05-01-2011, 17:00
ah comunque niente ho capito da me potete lockare e bannarmi