PDA

Visualizza la versione completa : [c++]cataloghi


giuseppe500
02-11-2010, 16:40
ciao.
Devo creare un mecchanismo di cataloghi per gestire le risorse della mia applicazione(un piccolo engine 3d).
Mi serve perch invece di instanziare un nuovo oggetto e caricarlo uso semplicemente una variabile copia del suo indirizzo e una mappa di smartpointer(uso lo shared pointer di boost)se gia instanziato e nella mappa.

Il catalogo in pratica incentrato su una mappa di smartpointer (shared pointer per la precisione).

problemi:
1)le prestazioni sono molto importanti
2)questi cataloghi devono essere accessibili da molte parti del mio progetto.
3)Vorrei per questo fare un singleton ,da problemi di prestazioni? oltre ai problemi legati al fatto che un po incasinato in ambiente multithreading,shodan mi ha messo la pulce nell orecchio e ho cercatoun po fino a trovare l'implementazione di un singleton thread safe su dr.dobs(una rivista di informatica).
4)Sempre shodan mi aveva parlato di un meccanismo di chaching , cosa intende?

grazie.
ciao.

shodan
02-11-2010, 18:45
Originariamente inviato da giuseppe500
3)Vorrei per questo fare un singleton ,da problemi di prestazioni? oltre ai problemi legati al fatto che un po incasinato in ambiente multithreading,shodan mi ha messo la pulce nell orecchio e ho cercatoun po fino a trovare l'implementazione di un singleton thread safe su dr.dobs(una rivista di informatica).

Il problema del Singleton in ambito multithreading descritto in questo documento.
http://www.erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf
Ma se non us il multithreading non hai grossi problemi.



4)Sempre shodan mi aveva parlato di un meccanismo di chaching , cosa intende?


Se non ricordo male avevo detto di preparare tutti i dati necessari prima di usarli, in modo da farli trovare pronti quando servono. Immagino ti riferisci a questo parlando della mappa.

giuseppe500
13-11-2010, 16:20
grazie shodan.
Un altra domanda:
se uso un normale smart pointer(uso lo shared pointer di boost) che punta ai cataloghi risolvo il problema del multithread?
Basta questo?
poi, importante: non riesco a visualizzare nella testa cosa accade in un applicazione con i thread , ogni thread come un istanza di una classe che viene eseguita in parallelo(ovvero come se avessi molte istanze della classe eseguite insieme)?
Se cosi ' , quando creo un thread quali classi vengono istanziate se ho piu' di una classe che partecipa nel thread?
scusa se sono ignorante, ma voglio capire.

shodan
13-11-2010, 19:01
Se i tuoi cataloghi sono dei Singleton, la risposta no.
Il documento che ti ho linkato mostra come il problema sia a monte di un eventuale shared_ptr e riguarda proprio la creazione del puntatore raw.
Ci sono vari modi per risolvere la cosa, a iniziare da boost::call_once(), ma il succo del discorso garantire che il puntatore raw sia allocato una e una sola volta e in ambito multithreading il Singleton non da questa garanzia.



poi, importante ...


Immagina di andare in un centro commerciale, con gente che va e viene. C' un gran caos, ognuno fa quello che gli pare. Alcuni guardano scaffali, altri fanno altro, qualcuno sta fermo, ma alcuni useranno le stesse risorse prima o poi: la stessa cassa, lo stesso scaffale, la stessa porta. Molti useranno la stessa cassa per pagare, ma solo uno pu prendere possesso della cassiera, pagare e rilasciare la cassiera: gli altri aspettano.

Il centro commerciale il programma, le persone i thread e la cassa la risorsa condivisa in cui i vari thread dovranno passare.
Pi o meno quello che succede in un programma multithreading, con la differenza che il programmatore deve coordinare il tutto.

giuseppe500
14-11-2010, 16:45
Se i tuoi cataloghi sono dei Singleton, la risposta no.

e se i cataloghi sono classi normali e utilizzo un raw pointer per accedervi?
In questo caso come il progetto accede alle risorse condivise in ambito multithreading?
Ci pensa il sistema operativo che gestisce i thread?

poi,ho visto cercando su google con multithreading o multiprocessor che esistono delle librerie che aiutano a programmare col multithreading tipo Threading Building Blocks, tu le hai mai usate?
esiste uno standard per queste librerie?Da quello che ho capito leggendo no.
Ho poi visto che si usano varie tecniche come i semafori e non so da dove partire a leggere ,esiste un buon libro o della documentazione?
A livello principiante intendo.
grazie.

shodan
14-11-2010, 17:41
Il mio no era riferito solo al Singleton, non a tutto il resto. Se esiste una funzione di creazione dei cataloghi, puoi e devi gestire il puntatore tramite uno shared_ptr.



In questo caso come il progetto accede alle risorse condivise in ambito multithreading?

Le risorse condivise di solito sono variabili globali o risorse del sistema (un file ad esempio), l'importante fare in modo che solo un thread alla volta ci accedam altrimenti si ha una race condition.


Ci pensa il sistema operativo che gestisce i thread?

No, ci devi pensare tu.

Delle TBB ho usato solo la tbbmalloc.dll per avere le funzioni di gestione della memoria e creare un allocatore compatibile con STL. Tuttavia (da quel che so) i thread in TBB stanno dietro le quinte, non si gestiscono direttamente.
Boost ha la libreria che stata adottata dal nuovo standard C++ e che prima o poi tutti i compilatori implementeranno.

Libri e documentazione sparsa ce n' ma non so se sono a livello principiante.
http://oreilly.com/catalog/multithread/excerpt/ch01.html
http://docs.sun.com/app/docs/doc/816-5137
http://en.wikipedia.org/wiki/Thread_%28computer_science%29

Puoi cercare con multithreading programming, race condition, deadlock, mutex; materiale ne salta fuori.

Loading