Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Multithreading (Access Violation)

  Alt 21. Nov 2016, 12:36
Darf man einen Thread nicht nacheinander ausführen? Einzelnd funktionieren die Threads auch.
Stell Dir vor, Du hast einen Thread, der 5 mal I := I + 1 ausführt und einen zweiten, der 5 mal I := I - 1 ausführt. Beide Threads brauchen ca. 1/2 Sekunde dafür.

Wenn Du Thread 1 startest , eine Sekunde wartest und Thread 2 ausführst, ist I wie vor den Threads 0.

Wenn Du beide Threads unmittelbar nacheinander ausführst, sollte eigentlich ja auch 0 rauskommen. Tut es aber nicht zwangsläufig.

"I := I + 1;" wird in mehreren CPU-Zyklen ausgeführt:

Merke Wert von I
Merke 1
Addiere beide Zahlen
Schreibe Ergebnis in I

Analog wird für Thread 2 folgendes getan:

Merke Wert von I
Merke 1
Subtrahiere Zahl2 von Zahl1
Schreibe Ergebnis in I

Wenn beide Threads gleichzeitig laufen bestimmt Windows, wann welcher Thread Arbeitszeit bekommen soll. Dazu wird z.B. Thread1 unterbrochen und Thread2 bekommt Arbeitszeit.

Dann passiert u.U. folgendes:

(Thread1)
Merke Wert von I
Merke 1
Addiere beide Zahlen
-->(Thread2)
Merke Wert von I
Merke 1
Subtrahiere Zahl2 von Zahl1
Schreibe Ergebnis in I
<--(weiter in Thread1)
Schreibe Ergebnis in I

Die Arbeit von Thread2 wird somit im Ergebnis nicht berücksichtigt.
Als Ergebnis kann alles zwischen -5 bis +5 raus kommen.


Wenn nicht nur einfache Integervariablen geteilt werden kann es zu weitaus schwerwiegenderen Fehlern bis hin zu kompletten Abstürzen kommen.

Man muss also darauf achten, dass gemeinsame Ressourcen gegen kritische gemeinsame Zugriffe abgesichert werden.


[EDIT] Das nur als grundsätzliche Anmerkung. Ob im genannten Beispiel so ein Problem vorliegen kann, kann ich nicht beurteilen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (21. Nov 2016 um 12:48 Uhr)
  Mit Zitat antworten Zitat