Ich bin sehr verwirrt über dieses Thema - ob das Lesen/Umschalten eines bool-Wertes Thread-sicher ist.C# und Thread-Sicherheit eines 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; } }
Sind sie alle Thread-sicher?
EDIT
Von dem, was ich gelesen habe (click) Unteilbarkeit von Bool garantiert nicht, wird es Thread-sicher sein. Will dann volatile
Hilfe eingeben?
Keine von diesen sind thread-safe. Der Thread, der den Getter aufruft, liest immer einen veralteten Wert. Wie alt es ist, hängt vom Prozessor und vom Optimierer ab. Es reicht von wenigen Nanosekunden bis unendlich. Der Getter muss auch synchronisieren. Oder Sie würden ManualResetEvent/Slim verwenden. –
@ Ksv3n * Zuweisung ist immer eine atomare Operation * Falsch, 'lange' (64 Bit) Zuweisung von einem 32-Bit-Programm ist nicht atomar. – xanatos
@HansPassant Ein Getter kann einen alten Wert lesen, das ist verständlich. Wie könnte es jedoch bis ins Unendliche dauern? Wenn Sie eine Sperre verwenden, wird der * korrekte * Wert gelesen - lesen Sie ihn erneut, als wäre er flüchtig? Ich glaube nicht, dass es so funktioniert, ich bin verwirrt darüber, was du sagst. Ich dachte, dass, sobald niemand mehr schreibt, der Getter richtig funktioniert. –