Domanda

Ho una variabile di riferimento-tipo che è readonly, perché il riferimento non cambiano mai, solo le sue proprietà. Quando ho provato ad aggiungere il modificatore volatile ad essa il compilato mi ha avvertito che non avrebbe lasciato entrambi i modificatori si applicano alla stessa variabile. Ma penso che ho bisogno di essere volatile perché non voglio avere problemi di memorizzazione nella cache durante la lettura le sue proprietà. Mi sto perdendo qualcosa? O è sbagliato compilatore?

Aggiorna Come Martin ha dichiarato in uno dei commenti qui sotto: Sia in sola lettura e modificatori volatili applicano soltanto al riferimento, e non alla proprietà dell'oggetto, nel caso di oggetti di riferimento di tipo. Questo è ciò che mi mancava, in modo che il compilatore è giusto.

class C
{
    readonly volatile string s;  // error CS0678: 'C.s': a field cannot be both volatile and readonly
}
È stato utile?

Soluzione

Né il readonlyvolatile modificatori sono penetrazione. Esse si applicano al riferimento sé, non le proprietà dell'oggetto.

La parola chiave readonly afferma e rafforza-che una variabile non può cambiare dopo l'inizializzazione. La variabile è il piccolo pezzo di memoria in cui è memorizzato il riferimento.

La parola chiave volatile dice al compilatore che il contenuto di una variabile potrebbero essere modificati da più thread. Questo impedisce al compilatore di utilizzare ottimizzazioni (come leggere il valore della variabile in un registro e utilizzando detto valore su più istruzioni) che potrebbero causare problemi di accesso simultaneo. Ancora una volta, questo riguarda solo il piccolo pezzo di memoria in cui è memorizzato il riferimento.

Applicato in questo modo, si può vedere che sono effettivamente escludono a vicenda. Se qualcosa è in sola lettura (può essere scritto solo una volta, in fase di inizializzazione o la costruzione), allora non può essere anche volatile (si può scrivere in qualsiasi momento da più thread).


Per quanto riguarda la vostra preoccupazione sui problemi di caching, IIRC, ci sono delle regole piuttosto severe su quando il compilatore può memorizzare nella cache il risultato di una chiamata proprietà. Tenete a mente che è una chiamata di metodo, ed è un'ottimizzazione piuttosto pesante (da stand-punto del compilatore) per memorizzare nella cache il suo valore e saltare chiamando di nuovo. Io non credo che sia qualcosa che devi preoccuparti di troppo tanto.

Altri suggerimenti

Un campo di sola lettura può essere scritto solo quando l'oggetto è stato ricostruito. Quindi non ci sarà alcun problema di cache della CPU perché il campo è immutabile e non può assolutamente cambiare.

Mentre il riferimento stesso potrebbe essere thread-safe, le sue proprietà non potrebbe. Pensate a cosa accadrebbe se due thread cercato di iterare simultaneamente attraverso un elenco contenuto nel l'oggetto di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top