2010-12-28 5 views
1

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?

Antwort

4

Bei den meisten pThreads Implementierungen finden Sie einige Speicherleck auf, wenn ein Thread beendet, wenn Sie entweder:

  • Anruf pthread_join(), dass Gewinde

    oder

  • den Faden als erstellen abgetrennter Thread, durch Aufrufen von pthread_detach() oder als ein Attribut zu pthread_create

Stellen Sie sicher, dass Sie einen der oben genannten Schritte ausführen.

+0

Erstellen des abgetrennten Threads milderte das Problem. Vielen Dank. –

0

Sind Sie sicher, dass Ihr Hauptproblem ein Memyleck ist? Es scheint mir eher, dass du zu viele Threads hervorbringst. Wenn Sie einen neuen Thread in einer rekursiv aufgerufenen Funktion erstellen, könnten Sie Tausende von Threads erhalten. Das kann Ihre Anwendung leicht töten. Denken Sie nur an den Speicher, der für den Stack jedes Threads benötigt wird.

+0

Die Machbarkeitsstudien meines Frameworks haben gezeigt, dass es nicht mehr als 10 gleichzeitige Ereignisse gibt, die einen Prozessor-Thread benötigen. –