I Szenario verfolgt haben, in C-Implementierung mit pThreads:Thread-Stack Leck durch eine rekursive Funktion
Der Haupt-Thread (T1) erzeugt ein weiteres Gewinde (T2), die auf ein Ereignis wartet.
auf einem Ereignisse T2 ruft eine Baum-Traversal recusive Funktion, die für eine Aktion in einem Funktionszeiger nimmt auf einem Baumknoten ausgeführt werden. Wenn während der Tree-Traversierung der Knoten gefunden wird, wird der FN-Zeiger ausgelöst, der einen Thread (T3) erstellt, den Knoten bedient und normalerweise aussterben soll.
Ich beobachte ein riesiges Speicherleck, das vom Stack des T3 kommt. Die Valgrind sagt mir, dass
==9251== 2,720 bytes in 20 blocks are possibly lost in loss record 142 of 157
==9251== at 0x402425F: calloc (vg_replace_malloc.c:467)
==9251== by 0x4010CDB: _dl_allocate_tls (dl-tls.c:300)
==9251== by 0x403A2E2: [email protected]@GLIBC_2.1 (allocatestack.c:561)
==9251== by 0x80571CC: serviceNode (NodeHndlr.c:432)
==9251== by 0x804AD88: preOrderTpTraversal (treefunct.c:503)
==9251== by 0x804AE01: preOrderTpTraversal (treefunct.c:513)
==9251== by 0x804AE01: preOrderTpTraversal (treefunct.c:513)
==9251== by 0x804AE01: preOrderTpTraversal (treefunct.c:513)
==9251== by 0x8057450: serviceproc (NodeHndlr.c:519)
==9251== by 0x403996D: start_thread (pthread_create.c:300)
==9251== by 0x411AA4D: clone (clone.S:130)
Hier die serviceproc
ist die T2 serviceNode
die Funktionszeiger für den Knoten ist.
So schließlich das System läuft aus vm und die Thread-Erzeugung nicht mit Fehlercode = 11 (nicht genügend Ressourcen)
Meine Frage ist, dass, sobald die die T3 (erstellt von serviceNode
) verlässt normalerweise, shouldn‘ t der thread stack wird automatisch müll gesammelt oder fehlt mir hier etwas. ?
Edit: oder wird das Problem mit dem Auslösen des Funktionszeigers verursacht?
Erstellen des abgetrennten Threads milderte das Problem. Vielen Dank. –