2010-11-21 8 views
1

Ich bin in eine Situation geraten, wo Threads, die ich erstellen abnehmbare ihren Speicher nicht freigeben, nachdem sie beendet haben.Stapel von abgetrennten Threads nie freigegeben

I die Fäden in folgenden Weise zu schaffen versucht,

1-

pthread_attr_setdetachstate(&pthread_attributes, PTHREAD_CREATE_DETACHED); 
pthread_create(&thread_id, &pthread_attributes, establish_connection, 
       (void *) establish_connection_arguments); 

2-

pthread_create(&thread_id, &pthread_attributes, establish_connection, 
       (void *) establish_connection_arguments); 
pthread_detach(thread_id); 

3-


Ich bin sicher, dass der Speicher noch beibehalten wird, wie Pmap dies bestätigt.

Ist es normales Verhalten, dass pmap die Threads mit ihrem Speicher noch anzeigt, nachdem die Threads abgeschlossen sind?

Antwort

0

Standardmäßig speichert glibc/nptl Thread-Stacks, um sie wiederzuverwenden. Dies verursacht geringe Synchronisationskosten für das Hinzufügen/Entfernen von Elementen aus der Cache-Liste und nicht-triviale (aber hoffentlich nicht große) Speicherkosten, vermeidet jedoch die Kosten für den Aufruf von mmap und munmap jedes Mal, wenn ein Thread erstellt oder zerstört wird. Ich vermute nicht, dass es eine Möglichkeit gibt, dieses Standardverhalten ohne extrem fragile Hacks zu ändern.

Edit: Da Sie sagte, dass joinable Threads freigegeben werden, hier ist meine zweite Vermutung auf den Grund: Es ist sehr schwierig für die Umsetzung ein Thread freizugeben seinen eigenen Stapel zu machen, da sie keinen Stapel haben würde laufen während der Arbeit, um seinen Stapel freizugeben. Es ist möglich, diese Einschränkung zu umgehen, indem man asm schreibt, das keinen Stack benötigt, um den Systemaufruf munmap unmittelbar gefolgt von der Selbstbeendigung auszuführen, aber ich habe noch nie eine Implementierung es tun gesehen.

0

Höchstwahrscheinlich wird der Speicherplatz von jedem Speicherzuordner im Cache zwischengespeichert. Das Ausführen des ungeraden Threads und das Nicht-Verwenden des Arbeitsspeichers gehen nachher verloren, ist kein Zeichen eines Lecks - Sie müssten wiederholt viele Threads öffnen und schließen und dann die Verwendung des Prozessspeichers überprüfen.

0

Das Programm pmap zeigt Ihnen die Speicherabbildung des Prozesses. Diese Erinnerung wird immer noch von dem Prozess verwendet. Wenn beispielsweise ein anderer Thread erstellt wird, wird dieser möglicherweise für seinen Stack verwendet.

Verwandte Themen