Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Thread Synchronisation (https://www.delphipraxis.net/153957-thread-synchronisation.html)

Schorschi5566 22. Aug 2010 17:35

Thread Synchronisation
 
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

Luckie 22. Aug 2010 17:40

AW: Thread Synchronisation
 
Kommt auf den Datentyp an, ob die Operation atomar erfolgen kann. Bei Ganzzahlendatentypen sollte es ohne Synchronisation gehen, bei komplexen Datentypen nicht.

Schorschi5566 22. Aug 2010 18:17

AW: Thread Synchronisation
 
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

igel457 22. Aug 2010 19:29

AW: Thread Synchronisation
 
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.

Schorschi5566 22. Aug 2010 20:04

AW: Thread Synchronisation
 
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

Luckie 22. Aug 2010 20:11

AW: Thread Synchronisation
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1044220)
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.

Schorschi5566 22. Aug 2010 20:26

AW: Thread Synchronisation
 
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. 8-)


Grüße,
Uwe

Luckie 22. Aug 2010 20:46

AW: Thread Synchronisation
 
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.

Schorschi5566 22. Aug 2010 21:12

AW: Thread Synchronisation
 
Hallo Luckie,

kein Problem.

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


Grüße,
Uwe


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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