2012-05-13 6 views
5

Ich arbeite an einem Projekt, in dem ich einen Hauptthread und einen Daemon-Thread habe, um Dateiausgaben durchzuführen. In meinem Hauptthread habe ich ein Feld pthread_t * _daemon, das ich löschen möchte, aber natürlich erst nach _daemon gibt NULL zurück (ich verstehe, dass pthread_exit() Speicherverluste verursachen).Löschen eines Daemon-Threads erst nach der Rückgabe

Wie kann ich es ohne busy-warte tun? Wenn ich versuche, eine Zustandsvariable zu verwenden, habe ich ein Problem - Wenn ich signal() Form _daemon anrufe, um meinen Hauptfaden aufzuwecken, löscht es _daemon, bevor es _daemon NULL zurückgibt.

Was ich getan habe, ist nur eine Mutex-Sperre verwenden, die gesperrt ist, wenn das Programm gestartet und entsperrt wird, bevor _daemon zurückgibt. Gibt es einen besseren Weg, der nicht zu viel Zeit in Anspruch nehmen würde?

+1

'pthread_join'? – Mat

+0

Es ist nicht klar, was Sie fragen. Was genau möchten Sie löschen? –

+0

Das Feld pthread_t, aber nur nach dem dort gespeicherten Daemon-Thread gibt – yotamoo

Antwort

5

pthread_detach() macht, was Sie suchen. Es klingt so, als würde es dein Problem lösen (kein Lecken) mit viel weniger Komplexität!

So können Sie sicher pthread_detatch(_daemon) aufrufen, wenn Sie damit innerhalb des anderen Threads fertig sind, ohne sich darum kümmern zu müssen, ob der Thread selbst noch läuft. Es tut nicht beenden Sie den Thread, stattdessen verursacht es den Thread aufgeräumt werden, wenn es beendet wird.

Aus der Dokumentation:

Die pthread_detach() Funktion zur Umsetzung kann , dass Speicher für das Gewinde Thread zeigen soll, wenn beendet diesen Thread zurückgewonnen werden. Wenn der Thread nicht beendet wurde, darf pthread_detach() nicht bewirken, dass er beendet wird.

können Sie tatsächlich einen Thread im gelösten Zustand erstellen, mit zu beginnen, indem attr der Einstellung:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

in geeigneter Weise zum Zeitpunkt der Erstellung. Die pthread_create() manpage sagt:

Wenn ein abgelöst Thread beendet wird, werden seine Ressourcen automatisch zu freigegeben wieder das System. [snip] Making ein Thread getrennt ist nützlich für einige Arten von Daemon Threads, deren Exit-Status die Anwendung nicht kümmern muss. Nach wird standardmäßig ein neuer Thread in einem verknüpfbaren Status erstellt, sofern attr nicht auf festgelegt wurde, um den Thread in einem getrennten Status zu erstellen (mithilfe von pthread_attr_setdetachstate (3)).

+0

Aber _demon, das ich frei haben möchte, ist im Haupt-Thread, nicht im Daemon-Thread. Ich möchte dieses Feld erst löschen, nachdem der Daemon-Thread beendet wurde – yotamoo

+2

@yotamoo: Ein 'pthread_t'-Objekt kann gelöscht werden, bevor der zugeordnete Thread zurückgegeben wird oder anderweitig ausgeführt wird. Der Thread selbst verlässt sich nicht auf das 'pthread_t'-Objekt - das Löschen des 'pthread_t'-Objekts zerstört den zugehörigen Thread nicht. Sie müssen jedoch 'pthread_detach()' aufrufen, damit das System weiß, dass es alle Thread-Ressourcen bereinigen kann, wenn der Thread zurückgegeben oder beendet wird. –

+0

Was genau bedeutet "lösche ein pthread_t Objekt"? – alk

1

pthread_t ist ein unsigned long int, so sehe ich nicht wirklich eine Notwendigkeit, einen Zeiger von pthread_t zu machen (auch Sie können es verwenden, die Adresse in pthread Funktionen), aber wenn Sie darauf bestehen, dann können Sie es löschen nach Erstellen Sie eine pthread (aber dann haben Sie keine Möglichkeit, damit zu kommunizieren, weil es eine Reihe von erstellten Thread ist - zum Verbinden, Trennen von Funktionen usw. verwendet).