Warum ist diese Aufgabe nicht Thread-sicher?

8

Ich habe dieses Buch von Joseph Albahari über Threading gelesen:
Ссылка

In Teil 2 habe ich dieses Beispiel gefunden:
Ссылка

Hier ist das vorher erwähnte Beispiel:

%Vor%

Thread-sichere Version:

%Vor%

Ich konnte nicht verstehen, warum die Methode Assign nicht Thread-sicher ist. Sollte die Integer-Zuweisung nicht atomare Operation auf 32- und 64-Bit-Architekturen sein?

    
Ivan Peric 12.03.2014, 11:34
quelle

1 Antwort

9

Die Zuweisung ist atomar , da jeder Lese-Thread entweder 123 oder den vorherigen Wert - nicht einen Zwischenwert - sieht. Es gibt jedoch keine Garantie, dass ein Thread den neuen Wert erst sehen kann, wenn zwei Speicherbarrieren vorhanden sind: eine Schreibspeicherbarriere im Schreibstrang und eine Lesespeicherschranke im Lese-Thread.

Wenn Sie zwei Threads wie diesen hatten (nachdem Sie _x public oder intern gemacht haben, so dass es von anderen Arten von Kursen gelesen werden konnte - oder mit dem Code in der Klasse ThreadSafe ):

%Vor%

... es gibt keine Garantie, dass Thread 2 jemals enden würde, weil Thread 2 die Zuweisung von Thread 1 möglicherweise nicht "sieht".

    
Jon Skeet 12.03.2014, 11:37
quelle