AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread Synchronisation

Ein Thema von Schorschi5566 · begonnen am 22. Aug 2010 · letzter Beitrag vom 22. Aug 2010
Antwort Antwort
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Thread Synchronisation

  Alt 22. Aug 2010, 17:35
Hallo DP,

einfache Frage:

Muss auch lesender Zugriff auf gemeinsam benutzte Variablen mit einer Criticalsection geschützt werden?

Drei Threads schreiben auf jeweils eigene Zähler. Im Hauptthread werden diese Zähler aufsummiert und angezeigt. Muss nun auch die Aufsummierung mit einer Criticalsection umgeben sein?


Viele Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Thread Synchronisation

  Alt 22. Aug 2010, 17:40
Kommt auf den Datentyp an, ob die Operation atomar erfolgen kann. Bei Ganzzahlendatentypen sollte es ohne Synchronisation gehen, bei komplexen Datentypen nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Thread Synchronisation

  Alt 22. Aug 2010, 18:17
Hallo Luckie,

habe Dein Tutorial schon halbwegs verinnerlicht. Klasse Arbeit.


Es geht um Extended-Werte, also 10 Bytes. Atomar geht ja nur bis 4, oder?

Mir war nur nicht klar, ob eben auch lesender Zugriff geschützt werden muss.

Habe trotzdem merkwürdige Thread-Verhaker, die ich mir langsam nicht mehr erklären kann.

Dabei läuft das Ganze zum Beispiel mehrere Minuten problemlos und plötzlich verhakt sich ein Thread, weil er seine Bool, die anzeigt, dass er noch was tut, nicht mehr zurücksetzt.

Also lesender Zugriff muss auch verrammelt werden. Werde ich mal testen. Wenn es dann noch klemmt, werde ich mal meinen Source zum Besten geben.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Thread Synchronisation

  Alt 22. Aug 2010, 19:29
Es gilt: Gibt es ausschließlich lesenden Zugriff auf einen Speicherbereich, so musst du die Zugriffe nicht synchronisieren. Sobald es aber auch nur einen einzigen schreibenden Zugriff von einem Thread aus auf einen Speicherbereich gibt, so musst du die Zugriffe mit dem schreibenden Thread synchronisieren.

Mit den Atomaren zugriffen würde ich sehr aufpassen, zwar erscheint das Argument, dass der Prozessor den Zugriff auf eine 4-Byte (32-Bit) bzw. 8-Byte (64-Bit) große Variable in einer Instruktion abarbeitet und dabei nicht unterbrochen werden kann schlüssig, jedoch hatte mir diese Annahme aus unerklärlichen Gründen unter Linux einige Probleme beschert, da sie scheinbar nicht immer zutreffend ist. Auch Race-Condition Detektoren wie Helgrind haben mich darauf hingewiesen, dass ich einen "Unsynchronized Read/Write of Size 4" habe.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Thread Synchronisation

  Alt 22. Aug 2010, 20:04
Hallo Andreas,

ich habe es so verstanden, dass die Interlocked-Funktionen dafür sorgen, dass die Kommandos zum Bearbeiten einer Integer o. ä. innerhalb einer Zeitscheibe erledigt sind.

Bleibt immer noch die Frage in Verbindung mit Criticalsections:

Muss ein lesender Zugriff in einem Thread auf eine Variable, die von anderen Threads geschrieben wird mit einer Criticalsection umgeben werden?

Folgender Fall für einen Hauptthread, der auf Ergebnisse aus den Subthreads wartet (Beispiel):

Delphi-Quellcode:
      bRunning := True;
      while bRunning do
      begin
        i := 0;
        while (i < Formulas.Count) do
        begin
          // FThreadResult sei eine Extended-Variable
          // Muss hier eine Criticalsection rein?
          if Formulas[i].FThreadResult > 0 then
          begin
            bRunning := False; // Schleife verlassen, Ergebnis ist da.
          end;
          inc(i);
        end;
      end;
Meiner Meinung nach ist es hier nicht nötig eine Criticalsection einzufügen, da die Schleife ja weiter durchlaufen wird, wenn ein Thread gerade die Ergebnisvariable beschreibt und somit der richtige Wert einen Durchlauf später vorhanden ist.

Oder liege ich da falsch und der lesende Zugriff könnte den schreibenden Thread blockieren?


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Thread Synchronisation

  Alt 22. Aug 2010, 20:11
Muss ein lesender Zugriff in einem Thread auf eine Variable, die von anderen Threads geschrieben wird mit einer Criticalsection umgeben werden?
Was hast du an unseren Antworten nicht verstanden?

Und ob die Schleife verlassen wird oder nicht, spielt keine Rolle. Es kommt darauf an, ob der Thread beim Schreiben der Variable unterbrochen wird oder nicht. Es kann zum Beispiel passieren, dass, wenn ein Record mit mehreren Feldern geschrieben wird, der Thread nach der Hälfte der Felder die Rechenzeit entzogen bekommt. Dann befinden sich die Daten in einem inkonsistenten Zustand beim Lesen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: Thread Synchronisation

  Alt 22. Aug 2010, 20:26
Hallo Luckie,

also habe ich Recht.

"Nein, lesende Zugriffe müssen nicht durch Criticalsections geschützt werden." wäre sehr viel klarer gewesen.

Dass ich schreibende Zugriffe schützen muss war mir vorher schon klar und das war auch nicht meine Frage.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Thread Synchronisation

  Alt 22. Aug 2010, 20:46
Nein, du musst auch lesende Zugriffe schützen, wenn komplexe Datentypen geschrieben werden. Ich dachte, das wäre durch mein Beispiel deutlich geworden.

Alles Käse. Wenn der schriebende Zugriff geschützt ist, kann ja gar nicht lesend drauf zu gegriffen werden, weil der Zugriff gesperrt ist.

Oh Mann, ich werde alt.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (22. Aug 2010 um 20:52 Uhr)
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Thread Synchronisation

  Alt 22. Aug 2010, 21:12
Hallo Luckie,

kein Problem.

Danke für die Antworten. Die letzten zehn Minuten hat sich nichts mehr verhakt.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz