2009-04-28 6 views

Antwort

8

Wenn Sie mit "Nur-Lese-Eigenschaften" meinen, dass der TThread-Nachfolger selbst diese nicht ändert und sie so schnell wie möglich initialisiert, dann wird alles in Ordnung sein (solange Sie sicherstellen, dass der Thread lebt und tritt immer dann auf, wenn Sie die Eigenschaftswerte anfordern).

Wenn Sie unter "Nur-Lese-Eigenschaften" meinen, dass der TThread-Nachfolger der einzige ist, der sie ändert, sollten Sie sicherstellen, dass der Hauptthread sie nicht liest, während sie geändert werden (es sei denn, sie sind atomare Werte) , wie ganze Zahlen).

+0

Perfekte Antwort! Genau die Informationen, die ich brauchte. Ich aktualisiere die Werte innerhalb des TThread-Nachkommens und nicht alle Werte sind atomar. Vielen Dank für Ihre Antwort. –

+1

und sogar "atomare" Werte wie Ganzzahlen können fehlschlagen, wenn Ihr Code nicht 32-Bit ausgerichtet ist. –

+0

Indy enthält einige atomare Datentypen in Core \ IdThreadSafe.pas, einschließlich IdThreadSafeInt64 und sogar TIdThreadSafeBoolean – mjn

3

Die Basistypen wie Integer, Boolean, Char und Pointer können jederzeit gelesen werden. Referenztypen wie string, Schnittstellen und dynamische Arrays können nur dann gelesen werden, wenn keine Chance besteht, dass der andere Thread gleichzeitig einen neuen Wert zuweist. Verwenden Sie zum Beispiel einen kritischen Abschnitt oder die Methode Synchronized, um sicherzustellen, dass der Thread den Wert nicht ändert, während der Hauptthread davon liest.

Sie müssen auch daran denken, dass jeder Wert, den Sie lesen, möglicherweise nicht mehr aktuell ist - der Thread hat möglicherweise einen neuen Wert zwischen dem Zeitpunkt, zu dem Sie ihn gelesen haben, und dem Zeitpunkt geschrieben.

+0

Ich glaube, es heißt "Synchronize" (kein D am Ende) –

2

Das hängt von den Eigenschaftstypen und möglicherweise von ihren Zugriffsmethoden ab.

Der Zugriff auf diese Eigenschaft ist kein Problem, da der Zugriff auf 32-Bit-Werte eine atomare Operation ist. Wenn die Eigenschaft jedoch größer als 32 Bit oder eine Klassenreferenz ist, die möglicherweise geändert wird, während der Hauptthread darauf zugreift, treten Probleme auf.

Verwandte Themen