AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kurze Frage zur Thread Sicherheit

Ein Thema von luke2 · begonnen am 4. Okt 2012 · letzter Beitrag vom 5. Okt 2012
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.779 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 19:07
Delphi-Quellcode:
procedure TThread.Execute;
begin
  while not Terminated do
  begin
    for I := Low(A) to High(A) do
    begin
      EnterCriticalSection(CS);
      if Use then
      begin
        //hier werden nur Felder von A[I] gelesen und geändert
      end;
      LeaveCriticalSection(CS)
    end;
    Sleep(1);
  end;
end;
Delphi-Quellcode:
procedure TThread.Execute;
begin
  while not Terminated do
  begin
    EnterCriticalSection(CS);
    try
      for I := Low(A) to High(A) do
      begin
        if Use then
          begin
            //hier werden nur Felder von A[I] gelesen und geändert
          end;
      end;
    finally
      LeaveCriticalSection(CS)
    end;
    Sleep(1);
  end;
end;
oder TThreadList verwenden.

Grüße
KLaus
Klaus

Geändert von Klaus01 ( 4. Okt 2012 um 19:15 Uhr)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#2

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 19:33
So kann ich es nicht machen, da das den Thread nutzlos machen würde. Es werden in der Schleife einige Berechnungen durchgeführt. Dies würde dazu führen, dass der Hauptthread beim Einfügen einfriert.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 19:55
Der Sinn der Sache ist ja, dass beim Einfügen bzw. Ändern einer Liste kein anderer Thread Zugriff darauf haben sollte.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 21:04
Da sich das Array selbst ja nicht ändert, könnte man hier für jedes Array-Element eine eigene CS (als Record-Member) nehmen. Das Array an sich so ist safe, so lange seine Länge nie verändert wird. Nur kann es dir passieren, dass ein Add() Aufruf nur halb fertig ist, und du ggf. "unfertige" Daten in dem Record hast. Und gaaaaanz selten kann da ggf., grad bei der String-Zuweisung, ein Zugriffskonflikt passieren. Ganz selten, weil du über das Setzen von "use" ganz am Schluss schon ein wenig Sicherheit hast, aber das ist trotzdem ein bischen Spiel mit dem Feuer. Sowas kann wochenlang sauber laufen, und dann wundert man sich (evtl. nach Änderungen, bei denen man nicht an diese besonderen Umstände dachte) woher auf einmal diese grausam schlecht zu debuggenden sporadischen AVs her kommen.

Bei Add() mit Threads wurde ich übrigens hellhörig: Ich hatte mal den Fauxpas begangen, eine einfache TObjectList mit Threads einzusetzen. Dort kann ein Add() ein SetLength() des internen Arrays auslösen, was meinem Thread 1-2x pro Woche (bei einer Anwendung, die 24/7 läuft) seine Daten unterm Poppo weggezogen hat. (Vermutlich öfter, aber der Speicher war wohl meist noch mit gültigem Kram belegt.) Eigentlich so offensichtlich, bei mir aber nach diversen Änderungen über Monate verteilt eingeschlichen, ohne dass ich es bewusst gemerkt habe. Gebranntes Kind scheut das Feuer: Seit dem bin ich mit CriticalSections per du =)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 22:40
Man könnte dem Thread auch über eine "gelockte" Property mitteilen, wie weit er Save arbeiten kann (ich nehme an er arbeitet in einer Schleife)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#6

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 22:56
Medium / Bummi
Danke für die Antworten. Habt ihr evtl. ein ganz kurzes Beispiel wie man es (nur mit TRTLCriticalSection) machen könnte, damit es ganz sicher ist?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 23:49
Den Setter/Getter der Property mit einer CriticalSection wrappen, im Thread auch nur auf die Property nicht auf die dahinterliegende Variable zugreifen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:44 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