Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CriticalSections wie verwenden? (https://www.delphipraxis.net/156318-criticalsections-wie-verwenden.html)

Bummi 28. Nov 2010 08:16

AW: CriticalSections wie verwenden?
 
@Assarbad

muss Dir nicht Leid tun, ich war komplett vernagelt.

Ich danke nochmals Sir Rufo, Jaenicke und Assbard für ihre Bemühungen.

xZise 28. Nov 2010 14:03

AW: CriticalSections wie verwenden?
 
Könnte man nicht das auch so beschreiben:

In dem „Universum“ gibt es zwei Personen und zwei Häuser. Jede Person stellt ein Thread dar, und jedes Haus dessen Speicherbereich. Eine CriticalSection ist jetzt wie eine Tür:

Wenn jetzt die Person A auf eine Variable der Person B zugreift (z.B. den Stromzählerstand ablesen), dann geht die Person A in das Haus von B und liest den Zählerstand ab. Aber währenddessen kann ja die Person B den Zähler manipulieren. D.h. Solange die Person B daran arbeitet schließt sie die Tür ab (betritt also die CriticalSection) und wenn sie fertig ist, verlässt sie das Haus (bzw. die CriticalSection).

Diese CriticalSection befindet sich dabei im Haus B (ist ja auch die Tür von Haus B). Solange kommt die Person A (oder jemand anderes) ran.

MfG
Fabian

SneakyBagels 21. Mai 2017 16:22

AW: CriticalSections wie verwenden?
 
Um von einem anderen Thema wegzukommen in welchem es ein bisschen ins OffTopic bzgl CriticalSections ging knüpfe ich hier mit einer Frage an.

Angenommen ich erstelle 2 oder mehr Threads, die alle ein und das gleiche tun nur jeweils eine eigene Liste mit bestimmten Informationen haben.
Zur Anzeige schickt jeder Thread eine Message an einen anderen Thread (um diese Zeile Code ist aktuell ein CriticalSectionLocal.Enter und Leave drum), welcher ein Label ändert (diesen Thread gibt es nur 1x). In diesem GUI-Thread hole ich die Message mit GetMessage.
Soweit erstmal Horror-Code #1, ist mir aber egal und darauf BITTE nicht eingehen!

Die Frage lautet nun: bringt es irgendetwas eine globale CriticalSection VOR der Erstellung der 2 oder mehr Threads zu betreten und am Ende aller Arbeit wieder zu verlassen?
Somit würde ich doch jeder der 2+ Threads in dieser einen, globalen Critical Section befinden.
Oder sollte jeder Thread seine eigene, lokale CriticalSection haben? Daraus bin ich bis hier hin leider noch nicht schlau geworden.
Außerdem... braucht man mit einer CriticalSection Synchronize(procedure bla.Caption := '123'; end); innerhalb eines Threads noch?

Das Thema scheint wohl öfter aufzukommen ob mehrere lokal oder eine global: http://www.delphipraxis.net/170736-m...alsection.html

Olli73 21. Mai 2017 17:13

AW: CriticalSections wie verwenden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1372244)
Angenommen ich erstelle 2 oder mehr Threads, die alle ein und das gleiche tun nur jeweils eine eigene Liste mit bestimmten Informationen haben.
Zur Anzeige schickt jeder Thread eine Message an einen anderen Thread (um diese Zeile Code ist aktuell ein CriticalSectionLocal.Enter und Leave drum), welcher ein Label ändert (diesen Thread gibt es nur 1x). In diesem GUI-Thread hole ich die Message mit GetMessage.
Soweit erstmal Horror-Code #1, ist mir aber egal und darauf BITTE nicht eingehen!

Die Frage lautet nun: bringt es irgendetwas eine globale CriticalSection VOR der Erstellung der 2 oder mehr Threads zu betreten und am Ende aller Arbeit wieder zu verlassen?
Somit würde ich doch jeder der 2+ Threads in dieser einen, globalen Critical Section befinden.
Oder sollte jeder Thread seine eigene, lokale CriticalSection haben? Daraus bin ich bis hier hin leider noch nicht schlau geworden.
Außerdem... braucht man mit einer CriticalSection Synchronize(procedure bla.Caption := '123'; end); innerhalb eines Threads noch?

Die CriticalSection um das ganze herum würde nur verhindern, dass das Ganze (Erstellern von 2+ Threads und abarbeiten) nicht ein zweites mal gleichzeitig gestartet werden kann.

Mit einer CriticalSection sperrst du eine globale Ressource (z.B.: globale Variable) für den Zugriff durch andere. Wenn du fertig bist, gibst du den Zugriff wieder frei. Wer zwischendurch drauf zugreifen will, muss warten. Stelle es dir einfach wie eine Toilette (= Ressource, die man i.d.R. alleine benutzen möchte) vor, das Türschloss ist die CriticalSection. Damit stellt man sicher, dass man alleine ist. Natürlich muss jeder, der die Toilette betritt, auch das Türschloss benutzen, sonst funktioniert es nicht (es darf auch keiner durch das Fenster einsteigen). Du hast in deinem Beispiel übrigens mehrere Leute in der Toilette eingeschlossen, und wartest bis alle Fertig sind, um sie wieder rauszulassen. Dabei sind sogar alle gleichzeitig am ******, was für eine Sauerei.

Wenn du allerdings auf VCL-Komponenten zugreifen willst brauchst du zwingend ein Synchronize oder du verschickst eine Message (SendMessage / PostMessage).

SneakyBagels 21. Mai 2017 17:20

AW: CriticalSections wie verwenden?
 
Heißt also auch eigentlich, dass eine lokale im Thread selbst erzeugte CriticalSection genau so sinnfrei ist wie eine die um den ganzen Code drum rum ist.

Olli73 21. Mai 2017 17:22

AW: CriticalSections wie verwenden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1372247)
Heißt also auch eigentlich, dass eine lokale im Thread selbst erzeugte CriticalSection genau so sinnfrei ist wie eine die um den ganzen Code drum rum ist.

Genau.

SneakyBagels 21. Mai 2017 17:27

AW: CriticalSections wie verwenden?
 
Das kam mir gleich sehr seltsam vor mit der lokalen CriticalSection. Denn wie soll Thread1 denn von der CriticalSection von Thread2 erfahren? Also ist das eher Quatsch.
Gut dann habe ich das wenigstens umgestellt und werde mir merken:

WENN (!) es nicht anders geht, dann Synchronize für GUI
und schreiben (nicht lesen?) von globalen Variablen nur mit globaler CriticalSection ("global"... es ist eine Unit mit Records und Classes).

Olli73 21. Mai 2017 18:07

AW: CriticalSections wie verwenden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1372250)
und schreiben (nicht lesen?) von globalen Variablen nur mit globaler CriticalSection

Wenn wirklich nur (!!!) gelesen wird, brauchst du nichts abzusichern. Wird aber irgendwo möglicherweise geschrieben, musst du auch die Lesezugriffe absichern.

Für viele Lese- und wenige Schreibzugriffe gibt es auch noch TMultiReadExclusiveWriteSynchronizer

SneakyBagels 21. Mai 2017 18:29

AW: CriticalSections wie verwenden?
 
Zitat:

Wenn der Schutz des globalen Speichers in einem kritischen Abschnitt implementiert wird, kann immer nur ein Thread auf den geschützten Speicher zugreifen.
Ist das nur ein wenig komisch formuliert oder ist das wirklich so?
Dem Zitat oben entnehme ich, dass eine normale CriticalSection auch anderen Threads den nur-lesen-Zugriff nicht erlaubt? Bitte sag mir, dass ich falsch liege.

Thread1 geht in Prozedur XYZ > CriticalSection.Enter > setzen von globaler Variable 123 > CriticalSection.Leave
Währenddessen kann Thread2 nicht lesen auf globale Variable 123 zugreifen?

Olli73 21. Mai 2017 18:36

AW: CriticalSections wie verwenden?
 
Während eines Schreibzugriffes darf nicht gelesen werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.
Seite 4 von 5   « Erste     234 5      

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