Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Threads: Lesen einer globalen Ressource ist erlaubt? (https://www.delphipraxis.net/58305-threads-lesen-einer-globalen-ressource-ist-erlaubt.html)

Pfoto 5. Dez 2005 12:30


Threads: Lesen einer globalen Ressource ist erlaubt?
 
Hallo zusammen,

ich möchte endlich das Thema "Threads" vollständig verstehen lernen und obwohl ich schon das fabelhafte Tutorial von Luckie gelesen habe, möchte ich zur Sicherheit nochmal fragen:

Da ich mit meinen Threads auch auf globale Variablen, Konstante und Funktionen zugreifen möchte, stellt sich mir die Frage, ob ich auch reine Lese-Vorgänge mit CriticalSections absichern muss.

Bei Luckie im Tutorial steht:
Zitat:

Wie schon im Beispiel zu sehen war, muss jedem Codestück, welches auf eine gemeinsame
Ressource zugreift ein Aufruf von EnterCriticalSection vorangehen.
Schließt das also auch Bereiche ein, die ich nur lesen möchte?
Oder verhindert das Betriebssystem/die Hardware einen Fehler, selbst wenn mehrere Prozessoren auf ein und den selben Speicherbereich lesend zugreifen (möchten)?


Hoffe nicht, dass ich nur zu blind war, es in Luckies Tutorial zu finden...


So, schonmal vielen Dank!

Chewie 5. Dez 2005 18:32

Re: Threads: Lesen einer globalen Ressource ist erlaubt?
 
Wenn überhaupt keiner schreibt, dann muss nichts synchronisiert werden.
Wenn aber einer schreibt und mehrere lesen, dann kann es natürlich passieren, dass Schreiben und Lesen gemischt werden und deswegen du fehlerhafte Daten lesen kannst.

Die Situation, dass beliebige viele Prozesse bzw. Threads auf eine Ressource lesend, aber nur einer schreibend, zugreifen darf, nennt sich Reader-Writer-Problem. Dafür sollte in der Literatur und im Netz Beispielimplementationen geben, da das ganze doch recht schwer verständlich ist.

shmia 5. Dez 2005 18:35

Re: Threads: Lesen einer globalen Ressource ist erlaubt?
 
Du brauchst die Resource X nicht zu schützen, wenn:
1.) die Resource X vom Hauptthread erzeugt wird
2.) dann deine Arbeitsthreads gestartet werde
3.) die Arbeitsthreads die Resource nur lesen
4.) der Hauptthread beim Programmende sicherstellt, dass alle Arbeitsthreads vorher beendet wurden

Geschützt werden muss nur dann, wenn ein Thread lesend auf eine Resource zugreift, während ein anderer Thread (kann auch der Hauptthread sein), die Resource schliesst oder schreibt.

Das Lesen aus einer Resource darf den internen Zustand der Resource natürlich nicht verändern.
Beispiel
Ein Dateihandle hat als internen Zustand die Dateiposition (kann mit Seek gesetzt werden).
Das Lesen aus einer Datei ändert die Position -> also muss der Zugriff auf diese Resource geregelt werden.

Pfoto 5. Dez 2005 20:37

Re: Threads: Lesen einer globalen Ressource ist erlaubt?
 
Ah! Ich danke Euch! Schon wieder was dazugelernt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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