Wofür werden Semaphoren verwendet?



  • Semaphoren haben doch auch nur EINEN Besitzer?!?
    Ein Mutex ist im Prinzip eine Semaphore, die nur 0 oder 1 sein kann.



  • ein typisches beispiel sind die dinierenden philosophen

    "... five philosophers are seated around a table. Each philosopher has a plate of spaghetti. The
    spaghetti are so slippery that a philosopher needs two forks to eat it. Between each plate is a fork.
    The life of a philosopher consists of alternate periods of eating and thinking. (This is something of
    an abstraction, even for philosophers, but the other activities are irrelevant here.) When a
    philosopher gets hungry, she tries to acquire her left and right fork, one at a time, in either order.
    If successful in acquiring two forks, she eats for a while, then puts down the forks and continues to
    think. " The key question is: can you write a program for each philosopher that does what it is
    supposed to do and never gets stuck? (It has been pointed out that the two-fork requirement is
    somewhat artificial; perhaps we should switch from Italian to Chinese food, substituting rice for
    spaghetti and chopsticks for forks.)
    
    Dijkstra, "the dining philosophers" 1965
    

    was passiert, wenn alle gleichzeitig die linke gabel greifen?
    deadlock...

    also: wenn du die linke gabel nimmst, schau, ob die rechte auch frei ist, wenn nicht, leg sie wieder hin.
    problem: alle machen das gleichzeitig... sie verhungern.

    <edit>blödsinn wegeditiert</edit>

    wie kriegt man es hin, daß keiner verhungert...



  • Eine SEM. ist ein nicht negative Zählvariable (unsigned short) der dekrementiert und inkrementiert wird.
    SEM (zumidest bei System V) existieren auch wenn kein Prozess sie benutzt.
    Deshlab muss der letzte Prozess diese auch wieder entfernen.



  • @Sgt. Nukem
    Mit "mehrere Besitzer" meinte ich, dass ich eine Semaphore praktisch mehrfach sperren kann, bis der Zähler 0 erreicht. "Besitzer" ist vielleicht etwas unglücklich formuliert...

    @elise
    Das Problem verstehe ich, aber wie hilft eine Semaphore da weiter? 😕
    (Abgesehen davon würde ich dann unter Windows WaitForMultipleObjects verwenden :p)

    @Unix-Tom
    Was ist, wenn ich eine Datenstruktur mit einer Semaphore schützen will, und den Zähler mit 5 initialisiere? Wenn jeder Thread dann 1 herunterzählt, sind max. 5 Threads gleichzeitig in der Datenstruktur am herumwurschteln. Als synchronisiert würde ich das nicht bezeichnen.



  • *schüttel* Was soll denn "eine Semaphore" sein? Es heißt "der (oder auch das) Semaphor", Mehrzahl "die Semaphore".



  • @bashar

    *decke reich*

    wußte ich nicht, das es der oder das heißt. klingt so "weiblich" :p



  • @tag

    war auch blödsinn, mein beispiel für semaphor.

    mein kopf deadlocked immer wieder bei diesem beispiel ... egal, dafür ist ja es da, zum darüber sinnieren.



  • Bashar schrieb:

    *schüttel* Was soll denn "eine Semaphore" sein? Es heißt "der (oder auch das) Semaphor", Mehrzahl "die Semaphore".

    Bah, schon wieder so ein hinterlistiger Anglizismus. Ich hab zu viel im MSDN gelesen 🤡



  • Ein Mutex kann nur ja oder nein sein, ein (!) Semaphor halt bis zu 10 Threads reinlassen. (EDIT: Als Beispiel jetzt natürlich nur!)
    So könnte ein OS z.B. maximal 10 HTTP Verbindungen zulassen, ein Downloadmanager der 17 verschiedene Sachen gleichzeitig saugen kann, könnte dann ein Semaphor bis 10 einsetzen zur _SYNCHRONISATION_! Erst wenn min. 1 Thread fertig ist, kann wieder ein anderer in den "kritischen Bereich".

    Zugegeben werden Semaphore wohl hauptsächlich auch nur binär (d.h. als Mutex) eingesetzt.



  • Unix-Tom schrieb:

    Eine SEM. ist ein nicht negative Zählvariable (unsigned short) der dekrementiert und inkrementiert wird.

    Für gewöhnlich besagt ein positiver Zahler, wieviele Prozesse/Threads noch rein dürfen und ein negativer, wieviele gerade darauf warten reinzudürfen.
    Die Zählvariable hat also ein Vorzeichen.



  • Also ist ein Semaphor doch eher für Fälle vorgesehen, in denen man einen bestimmten Vorrat einer Ressource hat, den sich mehrere Threads teilen.

    Was mir gerade eingefallen ist: Damit könnte man doch auch Lese-/Schreibvorgänge getrennt synchronisieren: Alle Leser verringern den Semaphor um 1, und ein Schreiber gleich um z.B. 10 (d.h. setzt den Zähler auf 0), so dass mehrere lesen, aber nur einer schreiben kann und sich niemand in die Quere kommt; Oder? (Wäre dieses Vorgehen eigentlich effizient?)

    Danke euch soweit 🙂


Anmelden zum Antworten