Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
Also Jeffrey Richter schreibt:
Zitat:
|
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
Zitat:
Thx, dieses brauchbare Info passte gut rein :thuimb: |
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
Ein Problem bekommt man nur, wenn man vergisst, dass die unterschiedlichen Prozessoren (ohne InterLocked) unterschiedliche Ansichten des Arbeitspeichers haben können (durch asynchrone Caches).
Beispiel aus dem PSDK...
Delphi-Quellcode:
Das Problem ist hier... ein Thread der gerade CacheComputedValue aufruft und ValueHasBeenComputed setzt und mit den anderen Prozessoren synchronisiert hat, muss nicht zwingend den neuen Wert von Value in die gemeinsame Speicheransicht übertragen haben (auch wenn die Befehle hintereinander stehen!). Ein zweiter Thread (auf einem anderen Prozessor) könnte also ValueHasBeenComputed = True 'sehen' aber noch nicht den neuen Wert von Value.
var
Value: Integer; ValueHasBeenComputed: LongBool = False; procedure CacheComputedValue; begin if not ValueHasBeenComputed then begin Value := ComputeValue(); ValueHasBeenComputed := True; end; end; function FetchComputedValue(out Val: Integer): LongBool; begin if ValueHasBeenComputed then begin Val := Value; Result := True; end else Result := False; end; Erst durch die Interlocked/Wait/CriticalSection/Synchronisations-Funktionen werden die Caches der Prozessoren synchronisiert.
Delphi-Quellcode:
Ergo: Lesen ohne Probleme, Setzen mit Interlocked.
procedure CacheComputedValue;
begin if not ValueHasBeenComputed then begin Value := ComputeValue(); InterlockedExchange(ValueHasBeenComputed, True); end; end; ps: welche Operationen 'atomar' sind und welche nicht, steht in den jeweiligen Prozessor-Beschreibungen... grobe Richtlinie: Integer-Operationen die nur eine Prozessoranweisung benötigen. |
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
Zitat:
|
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
ich arbeite auch im moment an einer multithreading-anwendung und muss aus mehreren threads variablen lesen bzw. schreiben... da hats bei mir auch oft genug exceptions gehagelt :gruebel:
dann habe ich von den CriticalSections zur absicherung von solchen lese/schreibvorgängen gelesen... und unter delphi gibt es die klasse TMultiReadExclusiveWriteSynchronizer... ein einfaches T:=TMultiReadExclusiveWriteSynchronizer.Create; erstellt das objekt und mit T.BeginWrite; bzw. T.EndWrite; kann ein schreibvorgang abgesichert werden... sprich solange nicht T.EndWrite; aufgerufen wurde, haben andere threads keinen lese-zugriff und warten bis endWrite aufgerufen wurde... Voraussetzung ist, dass Lesevorgänge dann auch mit T.BeginRead; und T.EndRead; umgeben sind... T.BeginWrite; Variable1:=Wert; T.EndWrite; T.BeginRead; Variable2:=Variable1; T.EndRead; Lesen funktioniert gleichteitig schreiben nur exclusiv... Vielleicht Bringts dem einen oder anderen was... |
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
Zitat:
Grüße Woki |
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
aja.
1) was is los? 2) was hat das mit meiner aussage zu tun? |
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
Zitat:
Außerdem ist die Tatsache, daß ein Thread im Rahmen seiner Arbeit daten liest, überhaupt kein Grund für den scheduler ihm nicht die Kontrolle zu entziehen. Grüsse Woki |
Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?
also ich hab auch schon bisschen erfahrung mit den threads.. besonderst krass is ja die thread verwaltung und synchronisation
bei internet anwendungen ( z.b. multithreaded server portchecker ). Da hab ich mir immer einen thread gebastelt der sich die "jobs" aus einer für ihn zugewiesenen klasseninstanz ( index einer liste ) rausholt, die abarbeitet und dann die results wieder in seine instanzen schreibt.. diese lese/schreibzugriffe hab ich natürlich auch mit EnterCriticalSection(section); und Leave umklammern müssen... was mich auch viel nerven gekostet hat ist die tatsache das wenn ich in einem thread globale variablen deklariert hab ( sieht ja so aus als ob die eigentlich nur in dem thread aktiv sein sollten ) oder sogar public oben in die thread classe geschrieben hab.. das das alle threads zubgriff drauf haben.. naja hab ichs halt in die private section rein geschoben und dann hatte jeder thread seine eigenen variablen die kein anderer veränderte o_O schon hart mit den dingern.. aber wenns mal rennt dann rennts krass :D :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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