AGB  ·  Datenschutz  ·  Impressum  







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

CriticalSection offen?

Ein Thema von Meflin · begonnen am 24. Mai 2005 · letzter Beitrag vom 25. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

CriticalSection offen?

  Alt 24. Mai 2005, 20:17
Moin,

folgendes Szenario: ich habe mehrere Threads, die Daten generieren und diese, wenn sie eine bestimmte Menge generiert haben, auf einen Stack legen. Dazu verwende ich natürlich eine CriticalSection, da ja alle Threads auf einen Stack zugreifen.

Nun habe ich mir überlegt, dass es sinnvoll wäre die Daten nur auf den Stack zu legen, wenn dies gerade kein anderer tut, und ansonsten weiterzugenerieren. Sonst wartet ja der Thread, bis die CriticalSection frei wird und betritt sie dann. Es ließe sich also Zeit sparen und die Performance erhöhen.

Nun die Frage: wie kann man raus finden, ob die CriticalSection betreten werden kann, oder nicht?

  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: CriticalSection offen?

  Alt 24. Mai 2005, 21:06
Das geht nicht, weil:
CS ist frei.
Thread A fragt und bekommt die Antwort "CS ist Frei" ( )
Thread B fragt und bekommt die Antwort "CS ist Frei" ( )
Thread A geht in die CS rein.
Thread B auch->

Die 'critical sections', also die Programmteile, die geschützt werden, musst Du zu kurz wie möglich halten. Bei einem Stack sehe ich da keine Probleme. Die paar ASM-Befehle machen den Kohl nicht fett.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

Re: CriticalSection offen?

  Alt 24. Mai 2005, 22:02
ausserdem hat jeder thread nen eigenen stack (also meinst du nicht diesen [ESP]).
hast du einen eigenen stack programmiert? wenn ja wie arbeitet der? über verkette listen oder so? dann musst du definitiv critical section benutzen um ein element der liste hinzuzufügen
du könntest aber auch eine variable setzen die du dann in jedem thread abfragst ob diese falsch ist, wenn ja kannste sie in dem thread auf war setzen und elemente hinzufügen -> solltets du fertig sein setze sie wider auf falsch

du kannst dann gefahr los in jedem thread idese vriable auslesen und gegebenfalls weiterarbeiten wenn das gerade beutzt wird
du hast dann den vorteil,wenn du es nicht so machsen würdest, dass beim hinzufügen eine elementes was in einer critical section gemacht wird alle anderen threads warten müssten und je nach dauer des hinzufügens warten alle anders
genau das wollteat damit ja beheben.

solltest du aber trotzdem den stack (ESP) meinen, da frage ich mich wie du da überhaupt was drauflegen willst :> jedefnalls hat da jeder thread nen eigenen
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#4

Re: CriticalSection offen?

  Alt 24. Mai 2005, 22:49
schau Dir mal MSDN-Library durchsuchenTryEnterCriticalSection an
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: CriticalSection offen?

  Alt 25. Mai 2005, 09:21
Mit TryEnterCriticalSection gehts. Man lernt nie aus ...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#6

Re: CriticalSection offen?

  Alt 25. Mai 2005, 13:18
@brechi: nein, ich meine nicht den "echten" Stack, sondern Stack mehr so als Allgemeinbegriff für Stapel

Zitat von Basilikum:
schau Dir mal MSDN-Library durchsuchenTryEnterCriticalSection an
Ok, hört sich interresant an. Nur bis jetzt verwende ich die TCriticalSection Klasse von Delphi. Das wird sich so nicht zusammen verwenden lassen oder?

Dann muss ich wohl oder übel die CriticalSection selber bauen...

  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: CriticalSection offen?

  Alt 25. Mai 2005, 14:15
Die TCriticalSection ist nur ein Wrapper für die Critical sections von Windows. Ich meine, Du könntest Dir eine Klasse ableiten und eine Methode 'TryEnter' dazu schreiben. Die besteht doch eigentlich nur aus der einen Zeile 'TryEnterCriticalSection...'
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#8

Re: CriticalSection offen?

  Alt 25. Mai 2005, 14:19
Zitat von alzaimar:
Die TCriticalSection ist nur ein Wrapper für die Critical sections von Windows. Ich meine, Du könntest Dir eine Klasse ableiten und eine Methode 'TryEnter' dazu schreiben. Die besteht doch eigentlich nur aus der einen Zeile 'TryEnterCriticalSection...'
naja, die Funktion erwartet ja als Parameter was vom Typ LPCRITICAL_SECTION, und ich frage mich ob meine TCriticalSection diesen Types ist. ansonsten habe ich nicht wirklich erfahrung mit dem umgang und der erweiterung von klassen...

  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: CriticalSection offen?

  Alt 25. Mai 2005, 14:31
Zitat von Meflin:
naja, die Funktion erwartet ja als Parameter was vom Typ LPCRITICAL_SECTION, und ich frage mich ob meine TCriticalSection diesen Types ist. ansonsten habe ich nicht wirklich erfahrung mit dem umgang und der erweiterung von klassen...
Der Typ ist exakt der gleiche. LP steht nur für Long Pointer. Unter Delphi deklariert man also wahlweise einen Pointertyp (für CritSects existiert der IMO schon) oder deklariert es als "var".
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#10

Re: CriticalSection offen?

  Alt 25. Mai 2005, 14:38
das wäre schön, funzt aber so leider nicht: "[Error] unMain.pas(73): E2033 Types of actual and formal var parameters must be identical"

die TCriticalSection Klasse stellt ein derartiges feature jedenfalls nciht direkt zur verfügung?

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:22 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