![]() |
Delphi-Version: XE7
TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Hallo zusammen,
ich habe zwei Threads die beide auf gemeinsame Felder zugreifen. Der eine Thread kann jeweils nur schreiben, der andere nur lesen. Muss ich nun alle schreibenden Zugriffe z.b. per TInterlocked.Exchange absichern oder ist das bei nur lesendem Zugriff des einen Threads nicht nötig? Kann es überhaupt passieren, dass die CPU Datentypen wie Byte, Word, DWord nicht atomar schreibt? Viele Grüße Zacherl |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Diese Interlocked-Funktionen arbeiten "atomar", so daß beim Schreibzugriff kein anderer Lesen kann.
Falls die CPU es nicht absichert, daß ein anderer Thread gleichzeitig liest, während ein Anderer schreibt, dan könnte es vielleicht passieren, daß zu von den 4 Bytes eines DWORD/INT teilweises noch ein paar Bytes von dem alten wert mit ausliest. :gruebel: |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Der Speicher wird immer in Busbreite ausgelesen/geschreiben. Einen zusammengestückelten Wert wie 2 Bytes vom alten und 2 Bytes vom neuen Wert gibt es nicht.
Wenn du also absolut schreibst (kein addieren) dann kannst du den Wert einfach dort hineinschreiben. Sobald du mehr als einen Zugriff machen musst, um das gewünschte Resultat zu erreichen, musst du den Bereich schützen. |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Zitat:
Zitat:
Bei zwei Threads die beide schreiben, muss ich doch theoretisch sogar auch nichts absichern, sofern der neue Wert nicht vom alten Wert abhängt oder? |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Zitat:
Schreibe einen weiteren, der aus dieser Variable liest. Starte jetzt mehrere von beiden Threads und schau, ob da etwas knallt. Dann hat man auch einen Erfahrungswert und wird noch viel ruhiger :) |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
In Richtung Multiplatform betrachtet ... benutzte einfach die neuen Interlocked-Funktionen aus der System-Unit.
Die aus der Windows-Unit kann man bekanntlich nicht überall benutzen. Aus irgendeinem unerfindlichem Grunde mach der Mac die WinAPIs nicht. :stupid: |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Zitat:
Delphi-Quellcode:
steckt.
packed record
Außerdem willst du eines Tages vielleicht doch mit mehreren Threads den Wert beschreiben und freust dich dann dass es direkt ohne Anlauf möglich ist. Ich würde einfach
Delphi-Quellcode:
oder sonst was verwenden und glücklich sein.
TInterLocked
|
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Zitat:
|
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Zitat:
Zu den packed records. Sowas würde also nicht funktionieren? Verstehe ich jetzt nicht ganz .. :shock:
Delphi-Quellcode:
Außer des Alignments (was beim ersten Element hier in dem Beispiel natürlich egal wäre), ändert das "packed" Attribut doch eigentlich nichts an der ganzen Geschichte.
type
TRec = packed record A: Integer; end; .. Rec.A := 100; |
AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?
Zitat:
Delphi-Quellcode:
führt dazu, daß A eher nicht auf einer der CPU genehmen Speichergrenze liegt und die damit zwei Zyklen zum Schreiben braucht. Zwischen diesen beiden Zyklen kann aber ein Lesezugriff (ebenfalls zwei Zyklen) erfolgen. Das hängt aber auch konkret von der verwendeten CPU ab.
type
TRec = packed record B: Byte; A: Integer; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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