AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Threadsicher : Verwendung von Semaphoren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadsicher : Verwendung von Semaphoren

Ein Thema von DelphiManiac · begonnen am 24. Jun 2008 · letzter Beitrag vom 30. Jun 2008
Antwort Antwort
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 11:41
Hallo,

ich brauche eure Hilfe bei folgender Geschichte:

Ich habe eine Funktion, die n-mal aufgerufen wird.

Diese Funktion, nennen wir sie mal Func_1() soll eine Zählervariable beim Eintritt prüfen auf 0,
wenn diese 0 ist, dann in die Funktion reingehen, ausführen und am ende wieder auf decrementieren.

Also im Prinzip wie eine Schlange, es stellen sich n-Leute an, der Erste darf die Funktion betreten und wenn er fertig ist, kommt der nächste dran.

Ich will threadübergreifend sicherstellen, dass die Funktion nur 1mal "parallel" durchlaufen wird.

Habe schon einiges hier über Threadsynchronisation und ähnliches gelesen und denke eine Semaphore wäre hier angebracht.

Könntet ihr mir erklären, wie man eine Semaphore nutzt / erzeugt / freigibt / dekrementiert usw.?

Vielen Dank!!!

Gruß
DelphiManiac
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 11:45
An dieser Stelle ist eine Critical Section geeigneter. In der Unit SyncObjs gibt es eine Kapselung - sie sollte weitgehend selbsterklärend sein.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#3

Re: Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 11:47
Leider kann ich an der Stelle keine Critical Section nehmen,

da auch ein paralleler Aufruf der Funktion in einem Thread möglich ist.
Deswegen wäre eine Zählervariable besser...
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 11:49
Zitat:
Leider kann ich an der Stelle keine Critical Section nehmen,

da auch ein paralleler Aufruf der Funktion in einem Thread möglich ist.
Deswegen wäre eine Zählervariable besser...
Das verstehe ich nicht. Eine Critical Section stellt sicher, dass nur ein Thread gleichzeitig einen bestimmten Code-Abschnitt ausführen kann. Was willst du erreichen?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#5

Re: Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 11:53
Ich habe aber leider,

eine Funktion die Ungefähr so aussieht:

Sende...
Warte... (Application.ProcessMessages)
Empfange
exit;


Das heißt in dem Hauptthread kann es jetzt passieren, dass während des Wartens die Funktion nochmals aufgerufen wird...
Ist an der Stelle kein schönes Programmdesign, aber muss das leider so behalten...
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 11:56
1. Wenn mehrere Threads die Routine aufrufen können, ist Application.ProcessMessages tödlich. Allgemein sollte man diese Methode tunlichst vermeiden.
2. Was willst du denn tun, wenn ein Thread die Funktion mehrfach aufrufen will? Sie nochmal ausführen oder überspringen? Im Eröffnungsbeitrag sagst du nämlich, dass du willst, dass sich die Threads "anstellen".
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#7

Re: Threadsicher : Verwendung von Semaphoren

  Alt 24. Jun 2008, 12:01
Hi,

ja nicht unbedingt die Threads, sondern eher die Aufrufer, die aus max 2 Threads kommen können.

Also wenn es zeitlichs so aussehen würde:

Zähler ist 0
Aufrufer 1 Func() // Zähler ist 1
Zähler ist 0
Aufrufer 2 Func() // Zähler ist 1
Zähler ist 0
Aufrufer 3 Func() // Zähler ist 1
Zähler ist 0
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#8

Re: Threadsicher : Verwendung von Semaphoren

  Alt 30. Jun 2008, 22:05
dafür eignen sich mutex am bessten denk ich.
semaphoren brauchst eigentlich nur wenn du die reihenfolge bestimmen willst.

mutex und waitforsingleobjekt sollte es tun.

lg
Arnulf
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: Threadsicher : Verwendung von Semaphoren

  Alt 30. Jun 2008, 22:43
Semaphoren sind für die Überwachung von maximal n gleichzeitigen Zugriffen auf eine Resource. Also damit nicht >= n+1 threads gleichzeitig auf eine Resource zugreifen können.
Das kommt nützlich, wenn man z.B. nur Platz für maximal n Clientsockets hat.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  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 12:17 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