Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Threadsicher : Verwendung von Semaphoren (https://www.delphipraxis.net/116148-threadsicher-verwendung-von-semaphoren.html)

DelphiManiac 24. Jun 2008 10:41


Threadsicher : Verwendung von Semaphoren
 
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

Apollonius 24. Jun 2008 10:45

Re: Threadsicher : Verwendung von Semaphoren
 
An dieser Stelle ist eine Critical Section geeigneter. In der Unit SyncObjs gibt es eine Kapselung - sie sollte weitgehend selbsterklärend sein.

DelphiManiac 24. Jun 2008 10:47

Re: Threadsicher : Verwendung von Semaphoren
 
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...

Apollonius 24. Jun 2008 10:49

Re: Threadsicher : Verwendung von Semaphoren
 
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?

DelphiManiac 24. Jun 2008 10:53

Re: Threadsicher : Verwendung von Semaphoren
 
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...

Apollonius 24. Jun 2008 10:56

Re: Threadsicher : Verwendung von Semaphoren
 
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".

DelphiManiac 24. Jun 2008 11:01

Re: Threadsicher : Verwendung von Semaphoren
 
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

Arnulf 30. Jun 2008 21:05

Re: Threadsicher : Verwendung von Semaphoren
 
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

Dezipaitor 30. Jun 2008 21:43

Re: Threadsicher : Verwendung von Semaphoren
 
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.


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