Unterschied zwischen Sperrflags und Semaphore

Kirby.exe

Top Contributor
Alsoo ich betreibe gerade etwas Klausurvorbereitung und wollte mir gerne eine gewisse Gegenüberstellung für die Implementierung von mutal exclusion erstellen.

Ich sehe im Moment noch nicht so richtig den Unterschied zwischen einfachen Variablen als Sperrflags und einer Semaphore :(
Welche Probleme bringt der Einsatz von einfachen Variablen als Sperrflag überhaupt mit sich?

Ich bedanke mich schonmal für eure Hilfe :)

Edit:

Also Semaphore hat ja den Vorteil, dass es im Vergleich zu Sperrflags kein Busy-Wait durchführt. Gibt es noch andere Vorteile?
 

LimDul

Top Contributor
So aus dem Bauch heraus - Eine Semaphore ist ein true/false Flag, was sicherstellt, dass keine Threading Probleme beim Zugriff darauf gibt.

Das heißt, dass es nicht vorkommen kann, kann das zwei Threads die Semaphore "bekommen", sondern wenn zwei Threads gleichzeitig die Semaphore anfordern, dass nur einer gewinnt und der andere entweder warten muss und die Info bekommt "Geht nicht".

Verwende ich nur einfache Variablen muss ich mir das selber bauen mit synchronized (In Java) Schlüsselwörtern - und da lauern, je nach dem wie man das macht einige Fallstricke. (Gerade erst gesehen, dass das C++ Forum ist).

Bei C++ stelle ich mir das noch schwieriger vor, das sicherzustellen, weil ich da ja viel viel mehr Schweinereien beim Zugriff auf Variablen anstellen kann, soweit ich weiß (Pointer etc.)
 

Kirby.exe

Top Contributor
Also es war jetzt nicht speziell auf C/C++ bezogen jedoch müssten wir z.B. Semaphore in C implementieren :) Verwendet man eigentlich Semaphore in der Realität? Werden stattdessen Monitore verwendet? Was wird sonst verwendet? :)
 

mihe7

Top Contributor
Eine Semaphore ist ein true/false Flag, was sicherstellt, dass keine Threading Probleme beim Zugriff darauf gibt.
@Kirby_Sike Das wäre binäres Semaphore (Mutex), ein Semaphore enthält allgemein einen Zähler, der die Anzahl an verfügbaren "Ressourcen" darstellt. Mittels sem_wait kann eine "Ressource" angefordert werden, d. h. sofern der Zähler größer als 0 ist, wird er um 1 reduziert, ansonsten wird gewartet, bis der Zähler wieder größer 0 ist. Mittels sem_post wird die "Ressource" dagegen freigegeben (Zähler um 1 erhöht).

Interessant bei Semaphoren ist, dass man den Zähler initialisieren kann.

Beispiel: Versandlager hat n Slots (=Threads) für LKW. D. h. es können maximal n LKW auf das Lager zugreifen (=beladen weren). Dafür kann man ein Semaphore verwenden, das mit n initialisiert wird. Jeder ankommende LKW muss sem_wait() aufrufen, um einen Slot für eine Beladung anzufordern. Verlässt der LKW den Slot, muss er sem_post() aufrufen, um den Slot freizugeben.

Werden n LKW zu einer Zeit beladen, ist der Zähler 0 und alle weiteren LKW müssen warten. Fährt ein LKW weg, erhöht sich der Zähler und der nächste LKW kann einfahren.

Man kann ein Semaphore auch mit 0 oder negativen Werten initialisieren. Initialisiert man mit -m, dann kann man einen Thread warten lassen, bis (m+1)-mal der Zähler erhöht wurde. Sagen wir mal, Du hast einen LKW, in den (m+1) Paletten passen, dann kannst Du ein Semaphore mit -m initialisieren und der Abfahren-Thread würde sem_wait() aufrufen. Sobald eine Palette aufgeladen wurde, wird sem_post() aufgerufen. Nach (m+1)-Paletten wacht der Abfahren-Thread auf...
 

Neue Themen


Oben