Hilfe bei Semaphoren ???

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hilfe bei Semaphoren ???

    Hallo liebe Community!

    Ich versuche gerade mich etwas in das Thema Systemprogrammierung unter Linux einzuarbeiten ... Nun hab ich die Prozesserzeugung mittel fork() durchgekaut und auch gut verstanden. Natürlich habe ich dazu auch verschiedene Beispiele Programmiert in dennen Kinder erzeugt werden die Programme aufrufen usw ... Nun bin ich bei dem Thema Semaphoren angekommen... ich hab mich eingelesen weiß nun das sie mit semget erstellt werden und das sie einen wert erhalten wenn ein prozess auf den dateibereich zugreift wird die Semaphore 0 wenn er den berich wieder freigibt wird sie 1 und der nächste prozess kann drauf zugreifen soweit so gut .... das hilft mir aber ehrlich nicht weiter ich kann mir nämlich immer noch nicht viel darunter vorstellen ich habe schon in einem Buch nachgelesen aber ganz erhlich ich verstehs nicht auch habe ich schon bei google gesucht aber auch hier nur extrem umständliche beschreibungen gefunden.. Mir würde es extrem helfen wenn ich ein kleines einfaches Beispiel also ein stückchen code eventuell mit erklärung ... also ich wäre sehr dankbar für ein paar links oder auch für selbst geschriebene beispiele oder erklärungen

    Danke im Vorraus
  • Hi,


    bei Wikipedia sind ein paar Ausschnitte einer Implementierung:

    Die Struktur:

    Quellcode

    1. struct Semaphor {
    2. int zaehler;
    3. Queue queue; /* Warteschlange */
    4. }


    Initialisierung:

    Quellcode

    1. void init (Semaphor& s, int v) {
    2. s.zaehler = v;
    3. s.queue.empty ();
    4. }


    Nutzungsoperationen (P/V):

    Quellcode

    1. /* down() */
    2. void P (Semaphor s) {
    3. s.zaehler = s.zaehler - 1;
    4. if (s.zaehler < 0)
    5. selbst_blockieren(s.queue); /* Blockieren des Prozesses, Einreihung in Warteschlange */
    6. }
    7. /* up() */
    8. void V (Semaphor s) {
    9. s.zaehler = s.zaehler + 1;
    10. if (s.zaehler <= 0)
    11. einen_entblocken(s.queue); /* Entblockieren eines Prozesses aus der Warteschlange */
    12. }
    Alles anzeigen



    the_old_Pirate schrieb:

    [...] ich hab mich eingelesen weiß nun das sie mit semget erstellt werden und das sie einen wert erhalten wenn ein prozess auf den dateibereich zugreift wird die Semaphore 0 wenn er den berich wieder freigibt [...]

    Nicht ganz. Initialisiert wird mit >=0. Es kann sein, dass du mehrere Ressourcen eines Typs zur Verfügung hast. Bei jeder Anfrage kannst du um 1 inkrementieren und bei Freigabe um 1 dekrementieren so, dass der Zähler (auch wenn der Startwert bei 0 ist) nicht immer binär sein muss.