SDL: Unterschied Semaphore und Mutex

Gast #1732519
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
#1732520
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.
Gast #1732739
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.
(Firma: O.D.I.S.) #1732748
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren