pthread_detach Frage

Lesezeit: 3 Minuten

Bis vor kurzem hatte ich den Eindruck, dass, wenn Sie einen Thread nach dem Spawnen “trennen”, der Thread auch nach Beendigung des “Haupt”-Threads weiterlebt.

Aber ein kleines Experiment (unten aufgeführt) widerspricht meiner Überzeugung. Ich habe erwartet, dass der getrennte Thread auch nach Beendigung von main weiterhin “Speaking from the disconnected thread” druckt, aber dies scheint nicht zu passieren. Die Bewerbung endet offenbar…

Sterben die “getrennten” Threads nach “Haupt”-Problemen? 0 zurückgeben?

#include <pthread.h>
#include <stdio.h>

void *func(void *data)
{
    while (1)
    {
        printf("Speaking from the detached thread...\n");
        sleep(5);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t handle;
    if (!pthread_create(&handle, NULL, func, NULL))
    {
        printf("Thread create successfully !!!\n");
        if ( ! pthread_detach(handle) )
            printf("Thread detached successfully !!!\n");
    }

    sleep(5);
    printf("Main thread dying...\n");
    return 0;
}

  • Es ist keine gute Idee, den Haupt-Thread zu beenden, während andere Threads laufen; In jedem Fall führt die Rückkehr von main() dazu, dass andere Threads sowieso beendet werden.

    – MarkR

    18. Mai 2011 um 11:52 Uhr

Benutzer-Avatar
NPE

Um die zu zitieren Handbuch für Linux-Programmierer:

Das getrennte Attribut bestimmt lediglich das Verhalten des Systems, wenn der Thread beendet wird; es verhindert nicht, dass der Thread beendet wird, wenn der Prozess mit beendet wird exit(3) (oder äquivalent, wenn der Haupt-Thread zurückkehrt).

Auch von der Handbuch für Linux-Programmierer:

Damit andere Threads die Ausführung fortsetzen können, sollte der Haupt-Thread durch einen Aufruf beendet werden pthread_exit()
statt exit(3).

  • Wird der Prozess beendet, wenn main() sagt return 0 (oder äquivalent) pthread_exit(NULL)? Es ist nur ein weiterer Thread des Prozesses …

    – Puffotter

    18. Mai 2011 um 10:15 Uhr

  • @puffadder: (1) der Hauptthread ist nicht “nur ein weiterer Thread”: Es gibt einige Fälle, in denen pthreads den Hauptthread anders behandeln als andere Threads; (2) return 0 und pthread_exit() sind nicht gleichwertig; Ich habe meine Antwort erweitert.

    – NPE

    18. Mai 2011 um 10:33 Uhr


  • Aha! Bitte schön… Ich habe einmal irgendwo gelesen, dass pthread_exit() und return für Threads gleich sind… und deshalb die ganze Verwirrung !!! Vielen Dank für die Klarstellung.

    – Puffotter

    18. Mai 2011 um 10:40 Uhr

  • Das pthread_exit Funktion und Rückkehr von der Startfunktion sind für alle Threads gleich. Für den Thread, der beim Start des Prozesses ausgeführt wird, main ist nicht seine Startfunktion. (Wie könnte es sein? Wenn ja, was würde globale Variablen initialisieren? Was würde ausfüllen argc und argv? Was würde den zurückgegebenen Wert weitergeben main?) Wenn es von main zurückkehrt, kehrt es zu der aufgerufenen Funktion zurück maindie dann den Vorgang beendet.

    – David Schwartz

    17. September 2011 um 7:29 Uhr


pthread_detach bedeutet nur, dass Sie sich nie wieder dem Thread anschließen werden. Dadurch kann die pthread-Bibliothek wissen, ob sie die Thread-Ressourcen sofort entsorgen kann, sobald der Thread beendet wird (der getrennte Fall), oder ob sie sie behalten muss, weil Sie sie später aufrufen können pthread_join auf dem Faden.

Sobald main zurückkehrt (oder beendet wird), erntet das Betriebssystem alle Ihre Threads und zerstört Ihren Prozess.

pthread_detach tut nicht das, was Sie denken – es zeigt der Implementierung an, dass der Speicherplatz, den der Thread mit der angegebenen ID verwendet, zurückgefordert werden kann, sobald er beendet wird, dh. nein pthread_join Es wird eine Operation durchgeführt.

Alle Threads werden beendet, sobald der Prozess, der sie enthält, beendet ist.

Ja, die abgelösten Fäden werden danach sterben return 0.

Aus dem Abschnitt ANMERKUNGEN von man pthread_detach

Das getrennte Attribut bestimmt lediglich das Verhalten des Systems, wenn der Thread beendet wird; es verhindert nicht, dass der Thread beendet wird, wenn der Prozess mit exit(3) beendet wird (oder äquivalent, wenn der Haupt-Thread zurückkehrt)

Benutzer-Avatar
Dinesh

Aus man pthread_detach:

Das pthread_detach() -Funktion markiert den durch thread identifizierten Thread als getrennt. Wenn ein getrennter Thread beendet wird, werden seine Ressourcen automatisch wieder an das System freigegeben, ohne dass ein anderer Thread mit dem beendeten Thread verbunden werden muss.

1344500cookie-checkpthread_detach Frage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy