Dato che sei interessato a questi casi di utilizzo, ti spiegherò il primo. Si noti che ciò si applica da una prospettiva c/C++, non è sicuro di come funzioni in java, anche se sospetto che in generale volatile in c/C++ e java vengano utilizzati per casi completamente diversi.
I dispositivi mappati in memoria sono periferiche alle quali il processore comunica nello stesso modo della memoria anziché tramite un bus speciale.
Supponiamo di avere una piccola luce con un timer che è mappato in memoria. Accendi la luce scrivendo 1 sul suo indirizzo di memoria & il suo timer interno conta alla rovescia per 5 secondi & spegne la luce e reimposta la posizione di memoria su 0. Ora stai sviluppando un programma in ca che deve accendere la luce dopo determinati eventi e talvolta spegnerlo prima che il contatore scada. Se si utilizza una variabile regolare (tende ad essere un puntatore o un riferimento per questo tipo di applicazione) per scrivere nella sua posizione di memoria, ci sono un certo numero di cose che potrebbero andare storte a causa delle ottimizzazioni del compilatore.
Se non si sta lavorando con quelle molte variabili e si accende la luce e poco dopo averlo spento senza altre variabili usando quel valore - a volte il compilatore eliminerà del tutto il primo compito, o in in altri casi manterrà semplicemente il valore nei registri del processore & mai scrivere in memoria. In entrambi i casi, la luce non si accende mai poiché la memoria non è mai stata modificata.
Ora pensa a un'altra situazione in cui si controlla lo stato della luce & è acceso. Qui, il valore viene estratto dalla memoria del dispositivo & conservata in un registro del processore. Ora, dopo pochi secondi, la luce si spegne da sola. Poco dopo si tenta di accendere di nuovo la luce, tuttavia dal momento che si legge che l'indirizzo di memoria & non lo ha modificato da allora, il compilatore assume che il valore sia ancora uno & pertanto non lo modifica mai, anche se attualmente è 0.
Utilizzando la parola chiave volatile, si evita che il compilatore effettui una di queste ipotesi durante la conversione del codice in codice macchina & assicurando che tutte quelle operazioni specifiche vengano eseguite rigorosamente come scritto dal programmatore. Questo è essenziale per i dispositivi mappati in memoria principalmente perché la posizione della memoria non viene modificata rigorosamente dal processore. Per questi stessi motivi, i sistemi multiprocessore con memoria condivisa spesso richiedono pratiche simili quando operano su uno spazio di memoria comune.
Grazie per le risposte. Qualsiasi input su come funziona esattamente volatile negli usi sopra elencati? – Ankur