AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Zugriff von Threads auf Instanzen, wo CriticalSection def.?
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff von Threads auf Instanzen, wo CriticalSection def.?

Ein Thema von s.h.a.r.k · begonnen am 19. Sep 2008 · letzter Beitrag vom 22. Sep 2008
 
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz