Semaphore in C++
-
Hallo liebe Gemeinde,
kennt jemand vllt. ein einfaches Beispiel zu Semaphoren und Mutex in C++?
Lieben Dank im Voraus,
Tanja
-
Hallo liebe Tanja,
kennst Du Google?
-
Habe schon nachgegoogelt aber die Beispiele waren nicht gut genug beschrieben, deshalb wollte ich hier mal nachfragen...
-
Schau z.B. auf http://en.cppreference.com/w/cpp/thread/mutex nach.
Bei Google musst du etwas aufpassen: Du wirst nicht allzu viel zur C++11-Standarbibliothek finden (ausser du suchst spezifisch), aber einiges zu Betriebssystem-APIs und diversen Wrapper-Bibliotheken.
-
-
Jetzt mal ohne Spass Jungs (und Mädels), ich habs mir ein paar mal angesehen, ich hab eine Vorlesung drüber gehört, ich habs im Tanenbaum gelesen.
Aber:
Was ist ein Semaphor?
Ein Mutex ist ganz klar, ein Lock, der gesetzt wird, damit andere Operationen gehindert werden auf gewissen Daten zu arbeiten. Als Stichwort fällt mir da immer die (atomare) "Test-and-Set"-Operationen ein...
-
Skym0sh0 schrieb:
Was ist ein Semaphor?
Mutexe regeln den Zugriff auf eine Ressource. Semaphore verwalten dagegen eine begrenzte Zahl an Ressourcen. Somit sind Mutexe ein Spezialfall von Semaphoren.
-
Hä?
Dass da ein Unterschied ist, ist ganz klar. Aber was heisst eine begrenzte Zahl an Ressourcen?
Klar, ich hab ein Ausgabemedium, ein Eingabemedium, einen Drucker, eine Netzwerkkarte (usw...), das sind meine Ressourcen. Und jetzt? Die werden doch nicht alle aufeinmal gesperrt, wenn auch nur eins genutzt wird oO
-
Nein, es geht natürlich nur um eine bestimmte Anzahl Ressourcen eines Typs.
Klassisches Beispiel: Mehrere Prozessoren. Wenn du jetzt einen Haufen Threads hast, müssen die irgendwie auf die vorhandenen Prozessoren verteilt werden.
Oder nimm ein Callcenter. Da müssen die eingehenden Anrufe auf die vorhandenen Telefone verteilt werden. Wenn mehr Anrufe eingehen, ist dann "besetzt".
-
D.h. Ich hab 4 Prozessoren, und wenn jetzt ein Thread ankommt, der einen Prozessor will, dann wird das Semaphor dekrementiert. Ist das Semaphor 0 und ein weiterer Thread kommt, dann wird der pausiert bis es wieder > 0 ist?!
-
Im Prinzip ja, da ein Prozessor(kern) auch nur einen Thread bearbeiten kann.
In der Praxis sieht es natürlich wesentlich komplizierter aus. Da bekommen die einzelnen Threads dann Zeiteinheiten zugeteilt, nach denen gewechselt wird. Dann haben die Threads auch unterschiedliche Prioritäten etc. Das ist dann wiederum eine Wissenschaft für sich, mit der ich mich aber nur sehr rudimentär auskenne.
Es ging mir auch nur darum, das Prinzip darzustellen.
-
daddy_felix schrieb:
Es ging mir auch nur darum, das Prinzip darzustellen.
Das ist Dir mit dem Callcenter und den Telefonen gut gelungen, wie ich finde!