Sono molto confuso su questo argomento - se la lettura/commutazione di un valore bool è thread-safe.C# e thread-safety di un bool
// case one, nothing
private bool v1;
public bool V1 { get { return v1; } set { v1 = value; } }
// case two, with Interlocked on set
private int v2;
public int V2 { get { return v2; } set { Interlocked.Exchange(ref v2, value); } }
// case three, with lock on set
private object fieldLock = new object();
private bool v3;
public bool V3 { get { return v3; } set { lock (fieldLock) v3 = value; } }
Sono tutti thread-safe?
EDIT
Da quello che ho letto (click) atomicità di bool non garantisce che sarà thread-safe. Sarà allora l'aiuto del tipo volatile
?
Nessuno di questi è thread-safe. Il thread che chiama il getter legge sempre un valore scaduto. Quanto stantio dipende dal processore e dall'ottimizzatore. Varia da una manciata di nanosecondi all'infinito. Anche il getter deve essere sincronizzato. Oppure useresti ManualResetEvent/Slim. –
@ Ksv3n * L'assegnazione è sempre un'operazione atomica * False, l'assegnazione 'long' (64 bit) da parte di un programma a 32 bit non è atomica. – xanatos
@HansPassant Un getter può leggere un vecchio valore, questo è comprensibile. Tuttavia, come poteva durare all'infinito? L'uso di un lucchetto farà leggere il valore * corretto * - rileggerlo come se fosse volatile? Non penso che funzioni in questo modo, sono confuso su quello che stai dicendo. Ho pensato che una volta che nessuno sta scrivendo più, il getter funzionerà correttamente. –