Fragen zu Semaphoren



  • Hallo,

    ich habe mal Fragen zu Semaphoren.

    Also, es gibt ja binäre Semaphoren und Zählsemaphoren. Wie kann man aber mit binären Semaphoren die Zählsemaphoren simmulieren? Und wieviele braucht man, wenn die Zählsemaphore von 0 bis n geht?



  • Wäre eine binäre Semaphore nicht das, was man weitläufig als Mutex kennt? Und damit einen Threadsicheren Zähler zu bauen kann doch nicht so schwer sein.

    class Semaphore {
       int zaehler;
       Mutex mutex;  // binäre semaphore;
    
       Semaphore (int zaehler) : zaehler (zaehler) {}
    
       void p ()
       {
          Mutex lokalerMutex;
          lokalerMutex.lock();
          --zaehler;
          if (zaehler == 0)
             mutex.lock();
          lokalerMutex.unlock();
       }
    
       void f ()
       {
          Mutex lokalerMutex;
          lokalerMutex.lock();
          if (zaehler == 0)
             mutex.unlock();
          ++zaehler;
          lokalerMutex.unlock();
       }
    };
    

    Nicht hauen, wenns Blödsinn ist.



  • Ich kenne Mutual Exclusive (Mutex) Semaphoren. Die nimmt man, um Ressourcen die von mehreren Threads/Prozessen verwendet werden abzusichern. Es gibt jeweils nur einen Thread, der diesen Mutex besitzen kann. Sloange dieser Thread den Mutex nicht wieder freigibt, müssen die anderen warten.

    Und dann kenne ich noch Event-Semaphoren (das ist vermutlich dein "Binärer" Semaphor). Diese können zwei Stati annehmen. Die werden üblicherweise verwendet, wenn z.B. ein Thread auf einen anderen warten muss, um dem wartenden mitzuteilen, das er seinen Job abgeschlossen hat.

    Zusammenfassend würde ich sagen, ein Mutex ist zur Absicherung von Ressourcen, ein Event Semaphor dient zur Synchronisation von Threads.



  • Ich kenne Mutual Exclusive (Mutex) Semaphoren. Die nimmt man, um Ressourcen die von mehreren Threads/Prozessen verwendet werden abzusichern. Es gibt jeweils nur einen Thread, der diesen Mutex besitzen kann. Sloange dieser Thread den Mutex nicht wieder freigibt, müssen die anderen warten.

    Und dann kenne ich noch Event-Semaphoren (das ist vermutlich dein "Binärer" Semaphor). Diese können zwei Stati annehmen. Die werden üblicherweise verwendet, wenn z.B. ein Thread auf einen anderen warten muss, um dem wartenden mitzuteilen, das er seinen Job abgeschlossen hat.

    Erklär bitte nochmal kurz. Bei einem Mutex müssen andere Threads warten, bis der "besitzende" Thread ihn freigibt (also gibt ws zwei zustädne: er wird von jemandem besessen oder nicht, er ist gesperrt oder nicht).

    Bei der Event-Semaphore ist der unterschied genau was? Die anderen Threads müssen warten und werden informiert, wenn sie endlich dürfen. Sas klingt für mich absolut identisch.



  • btw es heist mutual exclusion (gegenseitiger ausschluss) 🕶





  • Psycho schrieb:

    btw es heist mutual exclusion (gegenseitiger ausschluss) 🕶

    Hast recht. Das kommt davon wenn man Jahrelang immer nur "Mutex" benutzt und dann versucht aus dem Kopf die Urprüngliche Bedeutung zusammenzukriegen 🙂

    [quote = "Helium"]
    Erklär bitte nochmal kurz. Bei einem Mutex müssen andere Threads warten, bis der "besitzende" Thread ihn freigibt (also gibt ws zwei zustädne: er wird von jemandem besessen oder nicht, er ist gesperrt oder nicht).
    [/quote]

    Nee, ein Mutex speichert noch ein paar mehr Sachen. z.B. wer alles wartet, welche Thread-Priorität die Wartenden haben (danach wird nämlich entschieden wer als nächstes drankommt), einen Lock/Unlock-Zähler.

    [quote = "Helium"]
    Bei der Event-Semaphore ist der unterschied genau was? Die anderen Threads müssen warten und werden informiert, wenn sie endlich dürfen. Sas klingt für mich absolut identisch.
    [/quote]

    Der Event hat tatsächlich nur zwei Zustände (Posted und Reseted, das sind die OS/2-Termini. Ich bin mir nicht sicher, ich glaube unter Windows nennen die sich Signalled und Resetted).

    Hier können 100 Threads auf das selbe Ereignis warten. Sobald ein Thread den Event posted, haben alle 100 Threads gleichzeitig ihr Go.


Log in to reply