AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CriticalSections wie verwenden?

Ein Thema von Bummi · begonnen am 28. Nov 2010 · letzter Beitrag vom 21. Mai 2017
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:08
warum funktioniert dann folgendes
http://www.delphipraxis.net/156304-v...ml#post1064523
#26

wenn hier der zugreifende die CS ignoriert, bwz eine ander nimmt bekommt er Zugriff die der Intention der CS wiederspricht.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.119 Beiträge
 
Delphi 12 Athens
 
#2

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:12
wenn hier der zugreifende die CS ignoriert, bwz eine ander nimmt bekommt er Zugriff die der Intention der CS wiederspricht.
Dort hast du eine Resource und zwei kritische Sektionen, die du für den Zugriff benutzt.

In Sir Rufos Code hast du genau eine kritische Sektion für genau eine Resource.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:19
dann muss ich allen Beteiligten erst einmal Abbitte leisten. Der Getter/Setter stellt sicher dass ich mich in der richtigen CS befinde, habe ich das richtig verstandenen?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (28. Nov 2010 um 08:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:20
dann muss ich allen Beteiligten erst einmal Abbitte erleisten. Der Getter/Setter stellt sicher dass ich mich in der richtigen CS befinde, habe ich das richtig verstandenen?
jepp u got it
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:26
Genau.

Ich war auch erstmal verblüfft. Aber Kommentar #9 hat dann auch den Sinn hinter den CS pro Thread aufgezeigt. Ab da war's absolut klar.

Tut mir leid wenn ich zur Verwirrung beigetragen haben sollte. Man sollte eben den kompletten Kontext kennen
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 08:16
@Assarbad

muss Dir nicht Leid tun, ich war komplett vernagelt.

Ich danke nochmals Sir Rufo, Jaenicke und Assbard für ihre Bemühungen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 14:03
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:15
warum funktioniert dann folgendes
http://www.delphipraxis.net/156304-v...ml#post1064523
#26

wenn hier der zugreifende die CS ignoriert, bwz eine ander nimmt bekommt er Zugriff die der Intention der CS wiederspricht.
Das läuft im HauptThread
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  tc:Cardinal;
begin
  FCS.Enter;
  txt := 'Button1';
  tc := GetTickCount;
  while GetTickCount < (tc + 5000) do Application.ProcessMessages;
  Showmessage(txt);
  FCS.Leave;
end;
Das im Thread (also in einem anderen Thread als der HauptThread)
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  inherited;
  FCS2.Enter;
  txt := 'Thread';
  FCS2.Leave;
end;
Das Perverse daran ist, das funktioniert tatsächlich ... aber das hier würde auch funktionieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  tc:Cardinal;
begin
  txt := 'Button1';
  tc := GetTickCount;
  while GetTickCount < (tc + 5000) do Application.ProcessMessages;
  Showmessage(txt);
end;

procedure TMyThread.Execute;
begin
  inherited;
  txt := 'Thread';
end;
Erst wenn der HauptThread und der Thread gleichzeitig schreibend/lesend oder schreibend/schreibend auf die Variable txt zugreifen, erst dann und nur dann gibt es einen Zugriffsfehler.

Die CS ist nicht dazu da, dass es überhaupt funktioniert, sondern dass es immer funktioniert.

Allerdings wirst du bei diesem COde es wahrscheinlich niemals eine Zugriffsverletzung bekommen, da der Thread ja nur einen winzigen Moment läuft und genau diesen Zeitpunkt müsstest du treffen, um eine Zugriffsverletzung zu provozieren.
Nach dem Klicken von dem Button für das Starten des Threads, vergeht aber mehr Zeit, bis die Form wieder Eingaben zulässt, als der Thread mit der abarbeitung von Execute benötigt ... darum brauchst du hier gar keine CS, weil der Zustand so gesehen niemals eintrifft
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (28. Nov 2010 um 02:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:27 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