Warum gibt der folgende C # -Multithreadcode nicht null aus, obwohl er im Debugger ausgeführt wird?

8
%Vor%     
user673979 23.03.2011, 22:52
quelle

2 Antworten

17

Weil es nicht soll ... ++ und - sind keine atomaren Operationen (im Gegensatz zu Interlocked.XXXX - Interlocked.Increment).

Wenn Sie jeden Schritt von ++ und - aufschreiben und sehen, wie beide durch verschiedene Threads vermischt werden können, sehen Sie warum:

erhöhen

%Vor%

verringern

%Vor%

Wenn also die Reihenfolge 1,2,3,4,5,6 ist, erhalten Sie den Wert = 0; aber wenn die Reihenfolge 1,2,4,5,6,3 ist, erhalten Sie den Wert = 1.

    
Alexei Levenkov 23.03.2011, 23:00
quelle
1

Ich versuche nur, die Dinge einfacher zu machen ... Ich habe dieses Problem auch am Tag bekämpft: D

Volatile stellt sicher, dass Sie den neuesten Wert lesen, und wenn Sie alle Threads schreiben, sehen Sie diesen neuen Wert (und dafür sind volatile Operationen vorgesehen), aber es stellt nicht sicher, dass zwischen dem Lesen und dem Schreiben kein anderer Thread ist werde den Wert ändern. Auf der anderen Seite stellt Interlocked (das atomare Operationen zur Verfügung stellt) dies sicher.

Flüchtige Operationen sind gut, wenn zum Beispiel ein Thread oder Threads gelesen und andere modifiziert werden. Zum Beispiel, wenn Sie ein volatile Boolean _disposed -Flag in Ihrer Klasse haben, also wenn es ein Thread disponiert, wird es sofort für alle Threads als erledigt markiert.

    
vtortola 24.03.2011 09:32
quelle

Tags und Links