![]() |
Frage zu Critical Sections
Hallo,
ich möchte den Zugriff auf Variablen in meinem Thread von außen ausschließlich über published properties regeln. Gehe ich richtig in der Annahme, dass ich trotzdem bei Schreibzugriffen in den Propertymethoden Critical Sections benutzen muss? Wenn ja, wo initialisiere und lösche ich die Critical sections in meinem Threadobjekt? Im Construktor und im Destructor? |
Re: Frage zu Critical Sections
Zitat:
Zitat:
oder du leitest dein Objekt, wie dort ![]() |
Re: Frage zu Critical Sections
|
Re: Frage zu Critical Sections
Zitat:
Damit verbunden ist, dass entsprechende Informationen mit gespeichert werden müssen. Das fällt bei public weg, die Sichtbarkeit nach außen ist aber gleich. Deshalb sollte published auch nur dort verwendet werden, wo man es braucht, und normalerweise eher public. |
Re: Frage zu Critical Sections
Hallo,
danke für den Hinweis public vs published. Danke auch für den Beispielcode. Noch ne Frage: Ist dieses Konstrukt auch akzeptabel?
Delphi-Quellcode:
Zu welcher Gelegenheit werden die denn aufgerufen?
//threadunit
... initialization InitializeCriticalSection(CritSect); finalization DeleteCriticalSection(CritSect); end. |
Re: Frage zu Critical Sections
Initialization und Finalization werden beim Programmstart und beim Programmende aufgerufen.
Ich würde es nicht dort platzieren. Denn du hättest dort nur eine globale Variable und verbaust dir somit die Möglichkeit mehrere Instanzen zu erstellen welche unabhängig von einander funktionieren. |
Re: Frage zu Critical Sections
Zitat:
Jetzt habe ich letztens hier gelernt, dass man bei Bool oder Byte Variablen das nicht braucht. Was stimmt denn nun? |
Re: Frage zu Critical Sections
Weiß leider nicht ganz, in wie Weit sowas auf Multiprozessorsystemen stimmt, aber umsonst gibt es einige Dinge nicht.
Ich selber nutze für sowas seit Jahren den LOCK-Befehl in ASM. PS: Auch die String-Referenzzählung wurde damit aufgebaut, um sie Threadsicher zu machen. Für einfache Sachen kann man sicherheitshalber auch die Interlocked-Funktionen nutzen = ![]() Zitat:
aber im Prinzip hast du Recht. |
Re: Frage zu Critical Sections
Eigentlich bräuchte man keine Critical Section, so lange es sich wirklich nur um eine Variable handelt, die mit einem einzigen Speicherzugriff geändert wird.
Aber! In der Regel arbeitet der Thread in einem Arbeitschritt mit mehreren Variablen, deren Inhalt eventuell von einander abhängig ist. Deshalb wird der Zugriff am Anfang für alle Property gesperrt und erst nach der Verarbeitung wieder freigegeben. Beispiel:
Delphi-Quellcode:
So eine Klasse kann sich auch mal ändern oder es wird davon abgeleitet.
while not Terminated do
begin FSection.Acquire; try {hier die Verarbeitung der Property} finally FSection.Release; end; Sleep(50); end; Deshalb bei Property immer mit einer Critical Section arbeiten. Oft ist es auch sinnvoll die Section selbst als Property verfügbar zu machen. Dadurch können mehrere Property ausgewertet oder geändert werden, bevor der Thread weiterarbeitet:
Delphi-Quellcode:
FSubThread.Section.Acquire;
try if FSubThread.Property1 = ... then begin FSubThread.Property2 := ... FSubThread.Property3 := ... end; finally FSubThread.Section.Release; end; |
Re: Frage zu Critical Sections
Danke, ich denke jetzt hab ich alle Varianten begriffen. Das war sehr hilfreich.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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