Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Criticalsections, globale Variablen und Mainthread (https://www.delphipraxis.net/191271-criticalsections-globale-variablen-und-mainthread.html)

Delphi-Laie 27. Dez 2016 21:46

Delphi-Version: 5

Criticalsections, globale Variablen und Mainthread
 
Hallo Delphifreunde!

Falls das Thema in diesem Forum schon erschöpfend behandelt wurde, bitte ich um Nachsicht, ich fand jedenfalls nichts.

Daß man globale (i.S.v. unitinternen) Variablen, die von verschiedenen Threads aus angesprochen werden, wenigstens bei den Schreibzugriffen mit kritischen Abschnitten schützen muß, ist mir bekannt und wird von mir auch beachtet.

Doch ist dieses Schützen der globalen Variablen auch schon im Mainthread, also dem Thread, in dem auch die VCL läuft, erforderlich? Das hatte ich nämlich bisher so nicht beachtet.

Ich ahne es allmählich, daß dem so ist, denn "nicht threadsafe" liest man in diesem Forum ja an fast allen Ecken und Enden.

Vielen Dank und Gruß

Delphi-Laie

stahli 27. Dez 2016 22:03

AW: Criticalsections, globale Variablen und Mainthread
 
Der Mainthread ist ja auch ein Thread und es könnte Zugriffskonflikte mit einem nebenläufigen Thread geben.
Also musst Du Zugriffe schützen oder alle Zugriffe aus Threads über Synchronize durchführen.

Delphi-Laie 27. Dez 2016 22:10

AW: Criticalsections, globale Variablen und Mainthread
 
Na, das habe ich doch richtig geahnt, vielen Dank für die rasche Antwort!

Delphi-Laie 28. Dez 2016 07:50

AW: Criticalsections, globale Variablen und Mainthread
 
Zitat:

Zitat von stahli (Beitrag 1357308)
Der Mainthread ist ja auch ein Thread und es könnte Zugriffskonflikte mit einem nebenläufigen Thread geben.
Also musst Du Zugriffe schützen oder alle Zugriffe aus Threads über Synchronize durchführen.

Bitte doch noch eine Ergänzungsfrage: Sind die globalen Variablen durch kritische Abschnitte, die das Werteschreiben "umhüllen", für zusätzliche Lesezugriffe bereits ausreichend geschützt, oder sollten / müssen diese Lesezugriffe auch noch durch krtische Abschnitte geschützt werden? (Hier vermute ich, daß das Schützen des Schreibens bereits ausreicht.)

taveuni 28. Dez 2016 08:39

AW: Criticalsections, globale Variablen und Mainthread
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1357306)
Daß man globale (i.S.v. unitinternen) Variablen, die von verschiedenen Threads aus angesprochen werden, wenigstens bei den Schreibzugriffen mit kritischen Abschnitten schützen muß, ist mir bekannt und wird von mir auch beachtet.

Zitat:

Zitat von Delphi-Laie (Beitrag 1357306)
Doch ist dieses Schützen der globalen Variablen auch schon im Mainthread, also dem Thread, in dem auch die VCL läuft, erforderlich? Das hatte ich nämlich bisher so nicht beachtet.

Wo siehst Du hier einen Unterschied?

Wenn Du die globalen Variablen nur im Mainthread verwendest müssen die natürlich nicht geschützt werden.

jaenicke 28. Dez 2016 09:35

AW: Criticalsections, globale Variablen und Mainthread
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1357314)
Bitte doch noch eine Ergänzungsfrage: Sind die globalen Variablen durch kritische Abschnitte, die das Werteschreiben "umhüllen", für zusätzliche Lesezugriffe bereits ausreichend geschützt, oder sollten / müssen diese Lesezugriffe auch noch durch krtische Abschnitte geschützt werden? (Hier vermute ich, daß das Schützen des Schreibens bereits ausreicht.)

Wenn ein Lesezugriff nicht geschützt ist, kann es auch passieren, dass du genau zwischen dem Schreiben des ersten Teils und des zweiten Teils eines Wertes liest und somit ungültige Werte bekommst.

Um das zu vermeiden gibt es die atomaren Funktionen, die die Werte in einem Rutsch schreiben und lesen (TInterlocked.* aus Unit System.SyncObjs bzw. die alten Interlocked* Funktionen usw.). Mit denen sparst du dir die CriticalSections insgesamt, weil die Werte nie teilweise gelesen oder geschrieben werden können.

Statt CriticalSections wäre TMonitor.Enter...TMonitor.Exit auf das Objekt, das die entsprechenden Felder enthält, besser. Das ist in der Regel deutlich schneller.
Außerdem gibt es noch TMultiReadExclusiveWriteSynchronizer, wenn du auf eine Ressource oft lesend, aber nur selten schreibend zugreifst.

Delphi-Laie 29. Dez 2016 15:11

AW: Criticalsections, globale Variablen und Mainthread
 
Vielen Dank Euch beiden!


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