AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CriticalSections wie verwenden?

Ein Thema von Bummi · begonnen am 28. Nov 2010 · letzter Beitrag vom 21. Mai 2017
Antwort Antwort
SneakyBagels
(Gast)

n/a Beiträge
 
#1

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 17:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
781 Beiträge
 
#2

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 17:22
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.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#3

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 17:27
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).
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
781 Beiträge
 
#4

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 18:07
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
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#5

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 18:29
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?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
781 Beiträge
 
#6

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 18:36
Während eines Schreibzugriffes darf nicht gelesen werden.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: CriticalSections wie verwenden?

  Alt 21. Mai 2017, 18:49
CriticalSection macht keine Unterscheidung zwischen Read und Write. Der Block, den du absicherst, kann immer nur exklusiv ausgeführt werden.

ACHTUNG:
Jeder Thread (auch die nur Lesenden), der in irgendeiner Form auf den geschützten Speicherbereich zugreift, muss die selbe CriticalSection vorher betreten und nachher wieder verlassen.

Dementsprechend könnte dein Lese-Thread während eines Schreibzugriffes nicht gleichzeitig lesen. Auch könnten nicht mehrere Threads gleichzeitig lesen. Der bereits angemerkte Delphi-Referenz durchsuchenTMultiReadExclusiveWriteSynchronizer kann hier Abhilfe schaffen.

braucht man mit einer CriticalSection Synchronize(procedure bla.Caption := '123'; end); innerhalb eines Threads noch?
Ja, dein GUI Thread sollte ausschließlich Synchronize verwenden. Wenn - wie von dir beschrieben - die Worker-Threads alle eine eigene interne Liste haben und du die Daten eh per Message an den GUI Thread schickst, dann kannst du dir die CriticalSections sogar komplett sparen (vorrausgesetzt natürlich, dass die Message nicht nur Zeiger auf die eigentlichen Daten enthält - dann nämlich müsstest du im GUI Thread vor dem Zugriff die jeweils korrekte CriticalSection des sendenden Threads betreten).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Mai 2017 um 18:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 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