Forum: PC-Programmierung SDL: Unterschied Semaphore und Mutex


von Klaus (Gast)


Lesenswert?

Kann mir mal bitte jemand erklären, wozu genau bei SDL die Semaphore 
gedacht sind? Und was der Unterschied zu einem Mutex ist?

von g457 (Gast)


Lesenswert?

Leider kenne ich 'SDL' nicht.. aber normalerweise(tm) ist ein Mutex ein 
binärer Semaphor - also ein geschützter Bereich, in den nur ★einer★ rein 
darf.

HTH

von Klaus (Gast)


Lesenswert?

Und in ein durch einen Semaphor geschützter Bereich können dann quasi N 
Threads gleichzeitig rein?  Wozu kann man sowas brauchen?

von g457 (Gast)


Lesenswert?

> Und in ein durch einen Semaphor geschützter Bereich können dann quasi N
> Threads gleichzeitig rein?

So ist das normalerweise(tm), ja.

> Wozu kann man sowas brauchen?

Immer dann, wenn du höchstens eine maximale Anzahl (echt größer 1 ;-) 
Ressourcen gleichzeitig benutzen darfst. Bei 'Zugriff auf eine gemeinsam 
genutzte Datenstruktur absichern' macht das natürlich wenig Sinn (da 
reicht ein Mutex), aber wenn bestimmte (meist Hardware-)Ressourcen nicht 
öfters vorhanden sind, dann dürfen halt auch höchsten so viele Freds 
gleichzeitig drauf zugreifen.

Kleines konstruiertes Beispiel: N (>> X) Arbeiter-Freds rechnen fleissig 
vor sich hin. Für eine bestimmte (recht kurze) Operation braucht jeder 
eine sehr große Menge Arbeitsspeicher. Jetzt könnte natürliche jeder 
fleissig drauflos malloc()-en, aber wenn das alle gleichzeitig machen, 
dann geht das System in die Knie (und der Prozess wird i.d.R. abgewürgt, 
oder er bekommt keinen Speicher und kann nur schulterzuckend die Arbeit 
einstellen). Packt man eine Semaphore um die Ressource 
'Arbeitsspeicher', dann können z.B. maximal X Freds gleichzeitig $viel 
Platz belegen - wenn einer fertig ist gibt er seinen Platz wieder frei 
und der nächste (sofern einer ansteht) kommt dran. Dann müssen zwar 
gelegentlich welche warten, aber zu keinem Zeitpunkt geht das System 
K.O.

HTH

von Purzel H. (hacky)


Lesenswert?

Ich kann mir zB eine Struktur vorstellen, wo ich 5 parallele identische 
Prozesse habe. zB 5 XXXX angesteuert werden. Jedes XXXX hat einen 
Zeitablauf. Wenn ich an diese Prozesse Anfragen habe, so hat sie 
gemeinsame Warteschlange 5 Entries. Diese werden mit je einer 
Semaphorewertigkeit gesichert. Allgemein kann man mit wertigen 
Semaphoren wertige Warteschlangen haben.

von Rolf Magnus (Gast)


Lesenswert?

g457 schrieb:
> Leider kenne ich 'SDL' nicht.. aber normalerweise(tm) ist ein Mutex ein
> binärer Semaphor - also ein geschützter Bereich, in den nur ★einer★ rein
> darf.

Außerdem können Mutexe nur von dem Thread freigegeben werden, der sie 
gelockt hat, während diese Eischränkung bei Semaphoren nicht gilt. So 
kann man Semaphoren auch noch für Threadsteuerungen verwenden, wo 
Threads nicht gehen.

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Klaus,

in Mutex dient dazu, kritische Codebereiche vor dem mehrmaligen Betreten 
zu schützen. Z. B. "getBuffer(int length)" könnte globale Variablen 
verwenden, die bei gleichzeiter Nutzung durch verschiedene Threads 
durcheinander kommen.

Eine Semaphore dient der Thread-Kommunikation. Der erste Thread will 
eine Aktion durchführen wenn z. B. der zweite Thread eine Aktion beendet 
hat.
Das warten verbraucht dabei keine CPU-zeit.

Z. B.

thread1()
{
   ...

   sendMessage(thread2, aktion1_start); // Start der Aktion im anderen 
Thread
   takeSemaphore(aktion1_end_semaphore); // Warte bis Aktion beendet

   // Ergebnis bearbeiten

   ...
}


Gruß

Olaf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.