Semaphore und Mutext
-
Hallo, zusammen, ich möchte mehr über Parallelisierung erfahren.
Deswegen habe ich mich theoretisch mit Semaphore und Mutex beschäftigt.
Nun möchte ich ein kleines Programm schreiben, welches diese einsetzt.
Als Beispiel nehme ich das Problem mit den Toiletten:Es gibt 3 Toiletten und 10 Personen.
Die Toiletten möchte ich mit den Semaphoren verwalten.
Den Toilettengang mit dem Mutex.
Hauptproblem ist, dass es eine Warteschlange entsteht mit Leuten die auf die Toilette wollen.
Folgenden Ablauf habe ich mir überlegt:
1. Erzeuge 10 Threads, die auf die Toilette wollen
2. Erzeuge 3 Threads für jeweils eine Toilette
3. Ein Personenthread geht in die Toilette rein
Dekrementiert den Semaphore
Schaut nach, ob er kleiner 0 ist
Wenn ja, wird er in die Warteschlange geschoben
Wenn nein, locke ich mit Mutex den Toilettengang
Bis er fertig ist.
4. Dann geht der nächste aus der Warteschlange in die freigewordene Toilette.Problem ist, ichweiss nicht genau, wie ich diese Warteschlange implementieren kann. Vector mit Trheads??? ich konnte nix finden, was compilieren würde.
mein Code sieht bis jetzt kompiliert nicht.
Ich weiss nicht, wie ich die Warteschlange umsetzen soll.
Und paar spezifische Sachen in c++include <iostream> #include <cstdlib> #include <vector> #include <stdio.h> #include <unistd.h> #include <malloc.h> #include <pthread.h> #include <semaphore.h> #include <stdexcept> using namespace std; void createToilettenThread(); void createPersonenThread(); void *threadFuncReingehen(void *p); void *threadFuncReingehenLassen(void *p); void toiletteAnfordern(pthread_t thread); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; sem_t semaphoreWarteSchlangeVoll; sem_t ToilettenZaheler(3); //vector<thread> warteSchlange; //Thread warteschlange = 0; int main(int argc, char** argv) { return 0; } void createToilettenThread(int& toi) { pthread_t toiThread; for (int i = 0; i < toi; i++) { pthread_create(&toiThread,NULL,thrToiIstBereit,NULL); } } void createPersonenThread(){ pthread_t toiThread; for(int i = 0; i<100; ++i){ pthread_create(&anruferThr,NULL,thrToiNutzen,NULL); } } void *thrToiIstBereit(void *p) { int argument(0); int *retval=0; if(semaphoreWarteSchlangeVoll<3){ //wenn mind. eine Toilette frei ist sem_wait(&semaphoreWarteSchlangeVoll); pthread_mutex_lock(&mutex); //Speicherbereich locken // do something pthread_mutex_unlock(&mutex); //Speicherbereich für anderen Thread freigeben retval = (int *)malloc(sizeof(int)); *retval = argument; pthread_exit(retval); //thread beenden, Person ist fertig } } void *thrToiNutzen(void *p) { int argument(0); int *retval=0; while (1) { //Toilette anfordern ToilettenZaheler--; if(ToilettenZaheler<0) { if(semaphoreWarteSchlangeVoll<14) { //höhstens 15 Leute können in der Warteschlange sein warteschlange = thread; //Es gibt keinen freien Mitarbeiter //die Person wird in die Warteschlange geschoben, //wie kann ich das umsetzen` }else{ cout << "Warteschlange ist voll"; } }else { //Mind. eine Toilette ist frei sem_wait(&semaphore); //gewisse länge wird toillete benutzt pthread_mutex_lock(&mutex); //Speicherbereich lockenª // do something pthread_mutex_unlock(&mutex); } } retval = (int *)malloc(sizeof(int)); *retval = argument; pthread_exit(retval); //thread beenden }Danke für jeden Tipp.
-
Ich weiss nicht was du versuchst mit diesem Beispiel zu erreichen.
Mit realen Programmen die Multithreading verwenden hat das auf jeden Fall wenig zu tun.
-
Ist dir meine Fragestellung unklar?
Der Code ist nur ein ungefährer Beispiel, wie ich mir das vorstelle.Es richtet sich an die Leute, die schon mal so ein Problem gelöst haben und mir paar Tipps geben können.
-
@Tambler
Ja, mir ist die Fragestellung nicht klar.
Was mir aber klar ist, ist dass dir C++ Grundlagen abgehen.
Du kannst z.B. nicht einfach einesem_tVariable mit einer Zahl vergleichen, und dann erwarten dass dabei etwas sinnvolles rauskommt.Und ein Beispiel das nicht versucht eine Analogie zum realen Leben herzustellen, dafür mehr dem entspricht was man in echten Programmen anfinden kann, würde auch helfen.
Ein paar Tips:
* C++ Grundlagen lernen. Ohne die Grundlagen zu kennen kann man nunmal nicht programmieren. Einfach irgendwas was gut aussieht hinschreiben und hoffen dass es compiliert (und dann noch erwarten dass es sogar das tut was man erreichen wollte) funktioniert einfach nicht.
* Überleg dir ein realistisches Beispiel. Das Problem mit den unrealistischen Supermarkt+Wurstsemmel Beispielen ist dass sie keinen Sinn machen, und man daher auch als Profi schwer eine sinnvolle Lösung anbieten kann.
* Ich verwende bei sowas eigentlich nur zwei Arten von "Synchronisation Primitives", und zwar Mutexen und Condition-Variablen. Mit dieser Kombination kann man ziemlich einfach arbeiten und relativ wenig falsch machen. Wobei "relativ" heisst: verglichen mit Code der andere Primitives wie z.B. Events oder Semaphoren verwendet.
-
Tambler schrieb:
Es gibt 3 Toiletten und 10 Personen.
Und warum können nicht einfach 3-4 Leute gleichzeitig auf die Toilette gehen? Das würde den ganzen Synchronisierungsaufwand deutlich vereinfachen.