kritischer Abschnitt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • kritischer Abschnitt

    Mittag!

    Bevor ich noch weitere Stunden suche, hab ich mir mal gedacht, hier zu posten

    Es geht um gegenseitigen Ausschluss (oft auch kurz als mutex bezeichnet) von kritischen Abschnitten.

    Also folgendes Problem:

    ich habe eine Methode, die applikationsweit zu einem Zeitpunkt nur einmal ausgeführt werden darf. Es darf sich zu einem Zeitpunkt also nicht mehr als 1 "Person" in der Funktion befinden.

    In Java benutzt man dort den befehl "synchronized"

    Das ganze läuft dann im Idealfall so ab, dass alle, die in diese Funktion wollen an einer Warteschlange warten, bis der Vorige die Funktion verlassen hat. Dann darf der Nächste aus der Warteschlange die Funktion betreten und so weiter...

    Wie ich denke, gibt es sicherlich kein konstrukt in php, der das selbe erlaubt. Daher meine Frage: ob jemand sich mit sowas schon mal beschäftigt hat und ob es da vielleicht irgendwelche workarounds gibt, die vielleicht ein wenig den kritischen Abschnitt sichert.


    Gruß,

    Dioony
    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung.
    [Albert Einstein

  • #2
    Du könntest ein lock-File verwenden, bietet allerdings auch keine 100%ige Sicherheit, da zwischen überprüfen der Existenz und erzeugen der Datei ein anderer Thread die Datei erzeugt haben könnte!

    Kommentar


    • #3
      Oder in einer DB speichern, wann die Fkt angefangen hat und wann sie wieder zu Ende ist
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        Allgemein ausgedrückt: Du brauchst ein Semaphore.

        Das kann ein Flag in einer DB oder einem shared memory sein oder eine Datei oder oder oder.

        Und schließlich brauchst du Code in der Form
        Code:
        while (getSemaphore()) sleep(1);
        theMagicFunction();
        releaseSemaphore();

        PHP bietet diverse Funktionen und Features, die dir dabei helfen, aber keinen eingebauten Mechanismus wie in Java.

        Kommentar


        • #5
          hmm... ok... an sowas mit der db habe ich auch schon gedacht...

          semaphore... ok, jemand der ahnung hat

          also genau sowas geht auch, wenn es halt kein konkretes konstrukt gibt... habe nun selber schon weitergesucht und was genau zu dem thema gefunden...

          also wen es noch interessiert:

          php bietet genau solche semaphore:

          semaphore anfordern: sem_acquire

          semaphore freigeben: sem_release

          thx @ all
          Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung.
          [Albert Einstein

          Kommentar

          Lädt...
          X