Beh, sono certamente d'accordo, è piuttosto orribile che un tale dettaglio di implementazione sia esposto. È tuttavia lo stesso tipo di dettaglio esposto dalla parola chiave lock. Siamo ancora molto lontani dallo che il generatore di bug sia completamente rimosso dal nostro codice.
I ragazzi dell'hardware hanno molto lavoro da fare. La parola chiave volatile conta un sacco di core CPU con un modello di memoria debole.Il mercato non è stato gentile con loro, l'Alpha e l'Itanium non hanno funzionato bene. Non sono esattamente sicuro del perché, ma ho il sospetto che la difficoltà di scrivere codice thread solido per questi core abbia molto a che fare con questo. Sbagliare è piuttosto un incubo per il debug. La verbosità nella documentazione di MSDN Library per volatile si applica a questi tipi di processori, altrimenti è abbastanza inappropriata per i core x86/x64 e fa sembrare che la parola chiave stia facendo molto di più di quanto non faccia realmente. Volatile impedisce semplicemente di memorizzare i valori delle variabili nei registri della CPU su quei core.
Sfortunatamente, volatile è ancora importante per i core x86 in molto selezionare le circostanze. Non ho ancora trovato alcuna prova che sia importante su core x64. Per quanto ne so, e supportato dal codice sorgente in SSCLI20, l'istruzione Opcodes.Volatile è un no-op per il jitter x64, non modifica né lo stato del compilatore né emette alcun codice macchina. Sta andando nel modo giusto.
Il consiglio generico è che ovunque tu stia contemplando volatile, l'utilizzo del blocco o di una delle classi di sincronizzazione dovrebbe essere la tua prima considerazione. Evitandoli per cercare di ottimizzare il tuo codice è una micro-ottimizzazione, sconfitta dalla quantità di sonno che perderai quando il tuo programma presenta problemi di problemi di thread.
fonte
2010-08-21 14:53:02
+1 Penso che VolatileAttribute sia ok in questa situazione. Ma non so perché la MS ne fa una parola chiave. –
Si suppone che C# sia simile a C++ e che C++ abbia già "volatile". Dato che hanno deciso che avevano bisogno di questa funzionalità (e sono d'accordo), e la parola chiave è già nel set "simile", perché non usarla solo? – Blindy
@Blindy: C++ volatile ha un diverso modello di utilizzo, quindi non mi sarei tenuto a mente. –