Jestem bardzo zdezorientowany tym tematem - czy odczyt/przełączenie wartości bool jest bezpieczne dla wątków.C# i bezpieczeństwo wątku 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; } }
Czy wszystkie z nich są bezpieczne dla wątków?
EDIT
Z tego co czytałem (click) niepodzielność z bool nie gwarantuje będzie bezpieczeństwo wątków. Czy wtedy będzie pomocny typ volatile
?
Żadne z nich nie jest bezpieczne dla wątków. Wątek, który wywołuje getter, zawsze odczytuje nieaktualną wartość. Jak nieaktualne jest to zależy od procesora i optymalizatora. Zakres od kilku nanosekund do nieskończoności. Program pobierający również musi zsynchronizować. Lub możesz użyć ManualResetEvent/Slim. –
@ Ksv3n * Przypisanie zawsze jest operacją atomową * Fałszywe, 'długie' (64-bitowe) przypisanie przez program 32-bitowy nie jest atomowe. – xanatos
@HansPassant Getter może odczytać starą wartość, jest to zrozumiałe. Jak jednak może trwać w nieskończoności? Użycie blokady sprawi, że odczyta ona * poprawną * wartość - ponownie odczyta ją tak, jakby była niestabilna? Nie sądzę, że to działa w ten sposób, jestem zdezorientowany tym, co mówisz. Myślałem, że gdy nikt już nie będzie pisać, getter będzie działał poprawnie. –