Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.052 Beiträge
 
Delphi 12 Athens
 
#3

Re: Zugriff von Threads auf Instanzen, wo CriticalSection de

  Alt 22. Sep 2008, 19:28
Auch wenn mehrere Threads eine Methode ausführen, gibt es den Code nur einmal im Speicher. Allerdings hat jeder Thread einen eigenen Stack. Da die lokalen Variablen der Methode auf dem Stack oder in Registern stehen, gibt es also keine Probleme, wenn mehrere Threads gleichzeitig mit ihren lokalen Variablen spielen.

Kritisch wird es allerdings, wenn globale Variablen oder Klassenfelder angesprochen werden. Dazu benötigt man dann die CriticalSection. Es ist aber ungemein wichtig, daß sicher alle Zugriffe auf diese Variablen über die CriticalSection laufen, wenn die Möglichkeit besteht, daß auch andere Threads darauf zugreifen können.

Ein mögliches Problem hast du z.B. in deiner Exception-Behandlung

Delphi-Quellcode:
        
        b := FLog.LogToDatabase;
        FLog.LogToDatabase := False;
        Log(E.Message, ltError);
        FLog.LogToDatabase := b;
Da wir hier wieder außerhalb der CriticalSection sind, ist das so alles andere als thread-sicher!

Beispiel:

- Thread A kommt in diese Code-Sequenz, FLog.LogToDataBase sei True, er merkt sich den Wert in b und setzt es auf False.
- Thread B kommt zu der gleichen Sequenz, FLog.LogToDataBase ist jetzt false (von Thread A), er merkt sich das und
- wird wiederum von Thread A unterbrochen, der sein Log ausführt und FLog.LogToDataBase wieder auf true setzt, wie es vorher war.
- Nun darf Thread B weitermachen, der fälschlicherweise nun doch in die Database loggt und danach (noch falscher) FLog.LogToDataBase auf false setzt
- mit dem Ergebnis, daß ab hier so ziemlich alles den Bach hinunter geht.

Ohne das jetzt weiter analysiert zu haben, sollte die Exception-Behandlung besser mit in die CriticalSection genommen werden.

Thread-Programmierung ist nun mal nicht ganz so einfach...
Uwe Raabe
  Mit Zitat antworten Zitat