Thread-Programmierung Mutexe
-
hallo,
ich wollte das vielleicht manchem bekannte Parkhaus-Problem in C mittels Threads programmieren.
Jetzt habe ich aber das Problem, dass ich wenn ich die mittel pthread_create in die StartFunktion gehe ein sleep einbaue, damit die Threads in zufälliger reinfolge eintreffen, allerdings aus irgendeinem Grund arbeitet er nach dem sleep nicht mehr weiter.
Ich fürchte das es an den mutexex liegt, den ohne diese hat er normalerweise nach dem schlafen weitergearbeitet.
Kennt jemand das Problem oder weiß jemand was ich da übersehen haben könnte?
-
thecube schrieb:
hallo,
ich wollte das vielleicht manchem bekannte Parkhaus-Problem in C mittels Threads programmieren.
Jetzt habe ich aber das Problem, dass ich wenn ich die mittel pthread_create in die StartFunktion gehe ein sleep einbaue, damit die Threads in zufälliger reinfolge eintreffen, allerdings aus irgendeinem Grund arbeitet er nach dem sleep nicht mehr weiter.
Ich fürchte das es an den mutexex liegt, den ohne diese hat er normalerweise nach dem schlafen weitergearbeitet.
Kennt jemand das Problem oder weiß jemand was ich da übersehen haben könnte?Ich würde mir mal Zeile 17 oder 23 anschauen. Oder eine andere Zeile. Das sagt zumindest meine Glaskugel. Oder muß die mal wieder in die Reparatur?
Wie wäre es, wenn Du mal ein wenig Code postest. Mach mal ein minimales Beispiel.
-
hey,
danke mal für die antwort.
naja das Problem ist dass ich von der main aus mehrere Threads und ein Mutex erstelle:pthread_mutex_init (&wartend, NULL); pthread_t thr[NUMBER_OF_THREADS]; for(i = 0; i < NUMBER_OF_THREADS; i++) { pthread_create(&thr[i], NULL, randomSlot, &i); }
Mein Funktion randomSlot soll nun jeden Thread für eine zufällige Zeit schlafen lassen, wenn diese vorüber ist soll er versuchen, ob er noch im "parkhaus" platz ist (über die funktion ankommen).
Dieses "schlafen" realisier ich über sleep(rand() % 10). So nun habe ich das problem, dass jeder bis zum schlafen kommt und danach aber nicht mehr weiter arbeitet.void* randomSlot(void *i) { int random; int index = *(int*)i; sleep(rand() % 10); ankommen(index); return NULL; }
lg
-
Hallo theCube,
ich bin mir nicht 100%ig sicher, ob die Funktionen sleep() und rand()
auch beide thread-safe sind.rand() berechnet ja aufgrund eines gespeicherten Wertes eine neue
"Pseudo-"Zufallszahl. Der gespeicherte Wert wird dabei dann überschrieben.
Hier könnte es zu Problemen kommen.Anstelle von sleep kannst du vielleicht auch pthread_cond_timedwait()
nehmen.Dazu kommt noch, dass du einen Fehler in deinem pthread_create-Call
hast: Du übergibst die Adresse deiner Laufvariablen i. Im nächsten
Schritt wird i erhöht. Es ist nicht sichergestellt, dass randomSlot()
den richtigen Wert in index speichert.In deinem Beispiel hast du einen Mutex initialisiert, aber nirgends
gelockt. Also kann es so nicht daran liegen.Gruß mcr
-
Hm, also Deinen Mutex initialisierst Du ja schon mal ganz gut, aber ihn dann als
Rituellen Gegenstand gegen boese Bugs im Programm in der Ecke zu lassen bringt
nix. Ein anderes Problem seh ich da wieder irgendwie mit der rand().Ich kann mich da an einen aehnlichen Thread erinnern, vllt bringt Dir der Link
was, naja, is kein Parkhaus sondern ein Restaurand - aber ich glaube den Threads
und der Synchronisation ist das ziemlich egal