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
luke2

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

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 16:31
Danke, das sieht gut aus, geskill, aber ich möchte eigentlich keine externen Komponenten benutzen.

Es sieht ungefähr so aus:
Delphi-Quellcode:
type
  T = record
    Str: string;
    Use: Boolean;
  end;

private
  A: Array[0..5] of T;

procedure TThread.Add(const S: string);
begin
  with A[GetFreeField] do
  begin
    Str := S;
    Use := True;
  end;
end;

procedure TThread.Execute;
begin
  while not Terminated do
  begin
    for I := Low(A) to High(A) do
      if Use then
      begin
        //hier werden nur Felder von A[I] gelesen und geändert
      end;
    Sleep(1);
  end;
end;
Add wird aus dem Hauptthread aufgerufen. Use ist natürlich anfangs immer False und wird vom Thread auch irgendwann wieder auf False gesetzt. Das sollte doch sicher sein?

Geändert von luke2 ( 4. Okt 2012 um 16:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 16:57
Also wenn du Add() aufrufst bevor der Thread startet, dann geht das in Ordnung.

Nur so musst du das immer wissen, wann du es aufrufen darfst. Bei kleinen Programmen ist das noch in Ordnung, aber man sollte sich besser direkt angewöhnen das sauber umzusetzen. In dem Beispiel bei mir kann man dies ohne zu überlegen einfach aufrufen.

Das Auslesen passiert dann auch erst wieder wenn der Thread definitiv beendet wurde (z.B. via Join)?

Da es ein statisches Array ist sind die Schreibtugriffe ja wirklich nur aus die einzelnen Elemente begrenzt.

Und mit 2 Threads meinst du Hauptthread und TThread - oder?
Sebastian
  Mit Zitat antworten Zitat
luke2

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

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 17:04
Also wenn du Add() aufrufst bevor der Thread startet, dann geht das in Ordnung.
Add wird eigentlich nur aufgerufen, wenn der Thread bereits läuft. Was kann da denn passieren? Bisher lief die Anwendung eigentlich immer stabil.
Und mit 2 Threads meinst du Hauptthread und TThread - oder?
Jep

Kann man dein Beispiel auch mit den Windows CriticalSections (TRTLCriticalSection) umsetzen, so dass keine externe Unit/Komponente benutzt werden muss?
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 17:32
Die Schleife ist ja kurz und bei den heutigen leistungsstarken PC gehört schon ein bisschen Glück dazu das ein Fehler Auftritt. Weil beim Add() schreibst du ja auf einen Index I und bei jedem lesen greifst du immer auf Used von I lesend zu. Das ist nicht in Ordnung.

Mit einer TCriticalSection kannst du das nun einschränken. Der Vorteil bei den OTL Sections ist das man sie nicht initialisieren und freigeben muss. Zudem ist der MREW auch "sicherer" als der von Delphi.
Sebastian
  Mit Zitat antworten Zitat
luke2

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

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 17:41
OK, vielen Dank. Eine letzte Frage: Ist es denn so sicher (auch wenn es keine optimale Lösung ist)?

Delphi-Quellcode:
type
  T = record
    Str: string;
    Use: Boolean;
  end;

private
  A: Array[0..5] of T;
  CS: TRTLCriticalSection;

procedure TThread.Add(const S: string);
begin
  EnterCriticalSection(CS);
  try
    with A[GetFreeField] do
    begin
      Str := S;
      Use := True;
    end;
  finally
    LeaveCriticalSection(CS);
  end;
end;

procedure TThread.Execute;
begin
  while not Terminated do
  begin
    for I := Low(A) to High(A) do
    begin
      EnterCriticalSection(CS);
      if Use then
      begin
        LeaveCriticalSection(CS);
        //hier werden nur Felder von A[I] gelesen und geändert
      end
      else
        LeaveCriticalSection(CS);
    end;
    Sleep(1);
  end;
end;
  Mit Zitat antworten Zitat
Klaus01

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

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 20: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 20:15 Uhr)
  Mit Zitat antworten Zitat
luke2

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

AW: Kurze Frage zur Thread Sicherheit

  Alt 4. Okt 2012, 20: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
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 04:18 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