Newsgroup: it.comp.lang.c++
Titolo: Un probelema di condivisione

Salve a tutti ragazzi!
Stò facendo la tesi di Laurea e ho incontrato un problema che non ho la più
pallida idea di come si faccia a risolvere.
Vi spiego: ho fatto un'applicazione in VC++ 6 che apre un thread che gira a
1kHz per acquisire dati da due interfacce aptiche(
www.sensable.com
 e
www.forcedimension.com
). Ogni 40 millisecondi (quindi alla frequenza di
25Hz) questo thread invia dei dati alla view che a sua volta disegna  i dati
che il thread ha elaborato; il numero di elementi che devono essere
comunicati è variabile a runtime.
La struttura del programa è quindi di qesto tipo:
double *parametri;
int dimpar;
void mythread(....)
{
    cont=0;
    while(1)
    {
           // alcune elaborazioni....
            if(cont>40)
        {
                SendMessage(REDRAW); //La sintassi non è proprio questa ma
il concetto spero sia chiaro
                cont=0;
        }
        cont++;
        //altre elaborazini
    }
}
onStart()
{
    parametri=new double[N]; //con N variabile a runtime
    dimpar=N;
}
onRedraw{
    //operazioni che visualizzano i parametri in una finestra OpenGL
    //e che quindi deve leggerli
}
Ora che ho chiarito quello che stò facendo vi espongo il problema.
Quando compilo in modalità Debug il programma funziona alla perfezione.
Se compilo in modalità Release il programma disegna il primo frame e poi e
mi dice "Errore nella memoria, l'indirizzo xxxxxxx non poteva essere read".
Sono riuscito a capire (con non poco sforzo) che il problema è che in
modalità Relase il compilatore lascia nei registri della macchina i
parametri che devo trasferire e non li scrive in memoria.
Quindi in modalità release la funzione onRedraw non riesce a leggere i dati
che il thread gli passa. In modalità debug questo non avviene perchè tutti i
dati stanno in memoria e quindi il thread che gira in memoria condivisa
riesce a passare i dati alla funzione che fà la visualizzazione.
La mia domanda quindi è:
E' possibile fare in modo che il vettore dei parametri non venga copiato nei
registri (sò che l'pplicazione andrebbe più veloce ma in questo caso devo
fare per forza così) ma rimanga solo in memoria?
Ho letto che ci sono delle variabili in modalità volatile che dovrebbero
garantire questa cosa e con questa tecnica ottengo buoni risultati a patto
che le variabili siano statiche. Con quelle dinamiche proprio non mi è
riuscito.
Avete qualche idea?
Gradirei anche risposte con poco senso che magari mi diano uno spunto per
meditare a qualcosa che non mi viene in mente!
Dimenticavo di dirvi le prove che ho fatto:
1)eliminare nella gestione della onRedraw tutti i riferimenti alle variabili
parametro, risultato: l'applicazione funziona perfettamente ma non viene
visualizzato niente (ovviamente).
2) Dichiarare la variabile parametri in questo modo: double * volatile
parametri, risultato: L'errore persiste;
3) Dichiarare la variabile parametri in questo modo: volatile double
*parametri; In questo caso ho dovuto cambiare la variabile parametri a tutte
le funzioni che li utilizzavano per fare in modo che prendessero variabili
volatile, risultato: L'errore persiste.
Vi ringrazio molto e attendo risposte (magari anche per email)
pisani @ 
supereva.it
Sul mio sito(nella sezione software e utility) c'è un filmato che mostra
l'applicazione al lavoro (ma per ora in modalità debug), il filmato si
chiama Haptic Movie
http://www.ibisibi.tk

Premesso che:
 1. la questione è sfortunatamente piuttosto OT in questa sede (non c'è modo
di affrontare queste problematiche adoperando esclusivamente nozioni definite
nello Standard)
 2. la descrizione che hai fornito delle modalità con cui i due thread
condividono informazioni non è particolarmente accurata
mi permetto di fare un commento e darti una dritta:
(commento) La completa assenza di meccanismi di sincronizzazione (almeno nella
tua descrizione) suggerisce che l'intero problema sia stato affrontato in modo
un po' naïf. L'accesso non sincronizzato a memoria condivisa è sempre fonte di
guai in ambiente multithread, per ragioni che non è sempre facile capire
intuitivamente. Si vedano, ad esempio, le ricorrenti di discussioni sulla
validità del cosiddetto Double Check Locking o a quelle altrettanto ricorrenti
sull'uso di 'volatile'.
(dritta) Riscrivi il tuo messaggio in inglese e postalo su
comp.programming.threads.
Max

 ha scritto nel messaggio
news:b90qsv$tp0$1...@newsreader.mailgate.org...
