Forum: PC-Programmierung Shared memory & pthread_cond, wiso kommt es zum deadlock?


von Daniel A. (daniel-a)


Lesenswert?

Hallo zusammen

Ich habe ein kleines Programm geschrieben, bei welchem mehrere Worker 
Prozesse mittels fork erstellt werden, und ein Unterprozess pro Entry 
point. Ich habe für jeden Worker Prozess einen Ringbuffer in Shared 
Memory erstellt, von welchem die Worker Prozesse den nächsten Task 
holen, und jeder Prozess Tasks hinzufügen kann mittels der Funktion 
worker_queue_task. Aber immer wenn ich diese Aufrufe, hängt sich die 
Funktion bei pthread_cond_broadcast auf. Ich komme einfach nicht 
dahinter, was ich hier falsch mache: 
https://github.com/Daniel-Abrecht/worker/blob/master/src/worker/worker.c

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hi Daniel,
ich würde mal die Rückgabe aller pthread Funktionen testen, vielleicht 
bringt das einen Hinweis. Ansonsten, bist Du Dir sicher, dass Du die 
condvar und mutex attributes schon vor Ende der Lebenszeit der condvar 
und der mutexe bereits wieder frei geben kannst?

mfg Torsten

von Daniel A. (daniel-a)


Lesenswert?

Torsten R. schrieb:
> Ansonsten, bist Du Dir sicher, dass Du die condvar und mutex attributes
> schon vor Ende der Lebenszeit der condvar und der mutexe bereits wieder
> frei geben kannst?

Ja, dem Standard zufolge schon.
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_condattr_destroy.html
> After a condition variable attributes object has been used to initialize one or 
more condition
> variables, any function affecting the attributes object (including destruction) 
shall not affect any
> previously initialized condition variables.

Ich werde dann mal die Rückgabewerte prüfen.

von Daniel A. (daniel-a)


Lesenswert?

Nachdem ich den Code nochmals aufgeraumt, Fehlerbehandlungen 
hinzugefügt, und noch einige mal die Stelle angesehen habe, ist es mir 
irgendwann aufgefallen. Ich hatte die falsche Variable verwendet, 
nähmlich &current_worker->cond statt &w->cond. Wie konnte ich das nur 
übersehen.

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.