![]() |
Threads: Wie globale Int64-Variable sicher inkrementieren?
Hi,
Ein Beispiel: In Unit1.pas ist die globale Variable TotalBytesRec definiert.
Delphi-Quellcode:
In einem von mehreren Threads wird folgender Code ausgeführt:
var
TotalBytesRec : Int64 = 0;
Delphi-Quellcode:
Das Problem:
procedure TDownloadThread.OnWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer); var i: Integer; begin If AWorkMode=wmRead then begin Inc(TotalBytesRec, AWorkCount-FLastWorkCount); i := PercentDone; PercentDone := trunc((AWorkCount / FileSize) * 100); If i<>PercentDone then Synchronize(UpdateProgress); FLastWorkCount := AWorkCount; end; end; Der Aufruf von Inc() macht mir Sorgen; ist das überhaupt Thread-sicher? Bei nem Int64 wird wohl kaum eine atomare Operation daraus :? Gruß, Dani |
Re: Threads: Wie globale Int64-Variable sicher inkrementiere
sichere das mit critical section ab
oncreate(form1): sect := Tcriticalsection.create; sect.enter; inc(bla); sect.leave; onclose(form1): sect.free; |
Re: Threads: Wie globale Int64-Variable sicher inkrementiere
Beschaeftige dich mal mit "threadvar" (siehe Delphi-Hilfe).
|
Re: Threads: Wie globale Int64-Variable sicher inkrementiere
In
![]() Zitat:
Zitat:
Zitat:
Zitat:
Wegen der threadvars: Wenn ich die Variablen so deklariere:
Delphi-Quellcode:
dann bleibt jeder Schreibzugriff aus den Threads heraus wirkungslos. Ich muss da irgendwas falsch verstanden haben.
threadvar
TotalBytesRec : Int64; LastTotalBytesRec : Int64; Gruß, Dani |
Re: Threads: Wie globale Int64-Variable sicher inkrementiere
Zitat:
INC hingegen ist auf Einprozessor-Systemen Thread-Sicher, auf Mehrprozessor-Systemen ist das jedoch nicht garantiert, da muss dann unbedingt mit einer CriticalSection u.ä. gearbeitet werden. ...:cat:... |
AW: Threads: Wie globale Int64-Variable sicher inkrementieren?
Nur weil ich's grade seh, auch wenn's etwas alt ist. Aber bevor es nochjemand findet...
Zitat:
![]() Unter Assembler kann man dieses auch benutzen, wenn sich diese Operation als ein Befehl ausführen läßt. (z.B. auf eimer 64 Bit-CPU oder mit MMX)
Delphi-Quellcode:
asm
LOCK INC RAX end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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