Re: Speicherzugriffsfehler: bei einer globalen Variabel, mit Wert 1500
Verfasst: Sonntag 20. Januar 2019, 17:43
@__deets__: Das was Du da beschreibst kann nicht passieren weil ja beide Threads ihre ”eigenen Register” haben, also kann nicht die 1 auf die 0 addiert werden. Wenn das passieren könnte, dann ist der Code der den Kontextwechsel zwischen Threads macht ziemlich im Eimer.
@Honig: Was passieren kann wenn Du das `lock` entfernst ist das ein ``count=0`` den Counter *gar nicht* zurücksetzt. Das erhöhen von `count` um eins sind ja eigentlich zwei Schritt die nacheinander passieren: Alten Wert von `count` abfragen, und neuen um eins erhöhten Wert an `count` zuweisen. Und wenn das Rücksetzen dazwischen kommt, dann ist es als wäre es gar nicht passiert. Hier mal die beiden Threads in atomare Aktionen (bezüglich `count`) dargestellt mit thread.schritt) vor den einzelnen Schritten:
1.1) count = 0
2.1) tmp = count
2.2) count = tmp + 1
Wenn das so wie's da steht ausgeführt wird ist alles okay. `count` hätte danach den Wert 1. Auch das hier wäre okay:
2.1) tmp = count
2.2) count = tmp + 1
1.1) count = 0
`count` hätte danach den Wert 0. Problematisch ist diese dritte mögliche Variante:
2.1) tmp = count
1.1) count = 0
2.2) count = tmp + 1
Hiernach hat `count` den Wert 43 wenn es vorher den Wert `42` hatte. Die Zuweisung von 0 ist einfach verloren gegangen und es wurde weiter gezählt als wenn nichts gewesen wäre.
@Honig: Was passieren kann wenn Du das `lock` entfernst ist das ein ``count=0`` den Counter *gar nicht* zurücksetzt. Das erhöhen von `count` um eins sind ja eigentlich zwei Schritt die nacheinander passieren: Alten Wert von `count` abfragen, und neuen um eins erhöhten Wert an `count` zuweisen. Und wenn das Rücksetzen dazwischen kommt, dann ist es als wäre es gar nicht passiert. Hier mal die beiden Threads in atomare Aktionen (bezüglich `count`) dargestellt mit thread.schritt) vor den einzelnen Schritten:
1.1) count = 0
2.1) tmp = count
2.2) count = tmp + 1
Wenn das so wie's da steht ausgeführt wird ist alles okay. `count` hätte danach den Wert 1. Auch das hier wäre okay:
2.1) tmp = count
2.2) count = tmp + 1
1.1) count = 0
`count` hätte danach den Wert 0. Problematisch ist diese dritte mögliche Variante:
2.1) tmp = count
1.1) count = 0
2.2) count = tmp + 1
Hiernach hat `count` den Wert 43 wenn es vorher den Wert `42` hatte. Die Zuweisung von 0 ist einfach verloren gegangen und es wurde weiter gezählt als wenn nichts gewesen wäre.