Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Von mehreren Threads auf dieselbe globale Variable zugreifen? (https://www.delphipraxis.net/191285-von-mehreren-threads-auf-dieselbe-globale-variable-zugreifen.html)

a.def 29. Dez 2016 13:26

Von mehreren Threads auf dieselbe globale Variable zugreifen?
 
Wie greift man korrekt aus mehreren Threads auf eine globale Variable zu, wenn diese sogar noch verändert werden darf?
Aktuell prüfe ich bei jedem Schleifendurchgang, ob der Thread der die variable ändern möchte, der letzte Thread in meiner Liste ist. Das verlangsamt meinen Prozess aber etwas.
Mein Programm erzeugt bei einer bestimmten Aktion mehrere Threads die dieselbe Arbeit tun.
Aber ich habe eine einzige globale Variable, auf die zugegriffen und welche verändert werden muss.

Entschuldigung wenn ich mich irre, aber kann man hierfür Queue verwenden?
Delphi-Quellcode:
Queue(
 procedure
  begin
   // globale Variable verändern
  end
);

Uwe Raabe 29. Dez 2016 14:12

AW: Von mehreren Threads auf dieselbe globale Variable zugreifen?
 
Das kommt ganz auf die Art der Änderung an. Addieren, Subtrahieren sollte über TInterlocked geschehen. Bei einfachen Zuweisungen kann man aber nicht vorhersagen, welcher Thread der letzte ist und somit den endgültigen Wert bestimmt. Da hilft auch das Queue nicht. Das sorgt zwar für ein sicheres Schreiben, aber erzwingt nicht eine bestimmte Reihenfolge.

p80286 29. Dez 2016 14:15

AW: Von mehreren Threads auf dieselbe globale Variable zugreifen?
 
Welchen Typ hat die Variable?
bei einfachen Typen (integer,etc.) sollte es kein Problem geben. Bei records und anderen Strukturen wäre es ganz gut wenn Du ein Flag setzen würdest.
zb.

Delphi-Quellcode:
function readmyvalue:mytype;
begin
  result:=empty;
  while flag<>0 do sleep(1);
  flag:=Mythreadflag;
  result:=Myvalue;
  flag:=0;
end;
Ob das mit dem sleep so der Bringer ist, keine Ahnung, Ich habe bisher immer nur mit Messages gearbeitet, da brauch ich das nicht.

Gruß
K-H

a.def 29. Dez 2016 14:42

AW: Von mehreren Threads auf dieselbe globale Variable zugreifen?
 
Es handelt sich hierbei um einen Record.
Ich greife aus einer TObjectList auf ein Object zu. Das wird gecastet (Typ des Records)

Im Prinzip
Delphi-Quellcode:
aGlobal.iCurrentItemGlobal := TProcess_Record(aFileList.Items[i_]); // iCurrentItemGlobal ist vom Typ TProcess_Record.


Zitat:

Da hilft auch das Queue nicht. Das sorgt zwar für ein sicheres Schreiben, aber erzwingt nicht eine bestimmte Reihenfolge.
Die Reihenfolge ist eigentlich total egal. Nur das Schreiben muss sicher sein. Demnach würde Queue schon ausreichen?

Uwe Raabe 29. Dez 2016 15:28

AW: Von mehreren Threads auf dieselbe globale Variable zugreifen?
 
Zitat:

Zitat von a.def (Beitrag 1357448)
Im Prinzip
Delphi-Quellcode:
aGlobal.iCurrentItemGlobal := TProcess_Record(aFileList.Items[i_]); // iCurrentItemGlobal ist vom Typ TProcess_Record.
...
Die Reihenfolge ist eigentlich total egal. Nur das Schreiben muss sicher sein. Demnach würde Queue schon ausreichen?

Wieso ist die Reihenfolge egal? Was soll
Delphi-Quellcode:
aGlobal.iCurrentItemGlobal
denn am Ende beinhalten, bzw. wann wird damit etwas gemacht?

a.def 29. Dez 2016 15:37

AW: Von mehreren Threads auf dieselbe globale Variable zugreifen?
 
Diese Variable dient nur zur Anzeige. Ein anderer Thread bedient lesend sich dieser Variable.
Daher ist die Reihenfolge vollkommen egal.


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