it-swarm.com.de

pthread_detach Frage

Bis vor kurzem hatte ich den Eindruck, dass, wenn Sie einen Thread "lösen", nachdem er ihn abgelegt hat, der Thread lebt, nachdem der "main" -Thread beendet ist. 

Ein kleines Experiment (unten aufgeführt) widerspricht meinem Glauben. Ich rechnete damit, dass der abgelöste Thread auch nach Beendigung von main weiterhin "Speaking from the abgelöster Thread" druckt, aber dies scheint nicht der Fall zu sein. Die Anwendung endet offenbar ...

Sterben die "losgelösten" Threads nach "main" -Problemen return 0 ?

#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;
}
17
puffadder

So zitieren Sie das Linux-Programmierhandbuch :

Das losgelöste Attribut bestimmt lediglich Das Verhalten des Systems , Wenn der Thread beendet wird. verhindert jedoch nicht, dass der Thread beendet wird, wenn der Prozess mit exit(3) beendet wird (oder entsprechend, wenn der Haupt-Thread zurückkehrt).

Auch aus dem Linux Programmer's Manual :

Damit andere Threads die Ausführung Fortsetzen können, sollte der Haupt-Thread Beendet werden, indem pthread_exit() Statt exit(3) aufgerufen wird.

31
NPE

pthread_detach bedeutet nur, dass Sie nie wieder mit dem Thread verbunden werden. Auf diese Weise kann die pthread-Bibliothek wissen, ob die Thread-Ressourcen sofort verfügbar sind, sobald der Thread beendet ist (der getrennte Fall), oder ob sie diese beibehalten müssen, da Sie später pthread_join im Thread aufrufen können.

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

15
idz

pthread_detach macht nicht das, was Sie Ihrer Meinung nach tun - es zeigt der Implementierung an, dass der Speicherbereich, den der Thread mit der angegebenen ID verwendet, nach seiner Beendigung wieder freigegeben werden kann, d. Es wird keine pthread_join-Operation ausgeführt.

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

5

Ja, die abgelösten Threads sterben nach return 0.

Aus dem NOTES-Abschnitt von man pthread_detach

Das losgelöste Attribut bestimmt lediglich Das Verhalten des Systems , Wenn der Thread beendet wird. verhindert jedoch nicht, dass der Thread beendet wird, wenn der Prozess mit exit (3) beendet wird (oder äquivalent, wenn der Haupt-Thread zurückgegeben wird)

1
freethinker

Von man pthread_detach:

Die Funktion pthread_detach() markiert den von Thread identifizierten Thread als getrennt. Wenn ein getrennter Thread beendet wird, werden seine Ressourcen automatisch an das System zurückgegeben, ohne dass ein weiterer Thread mit dem beendeten Thread verbunden werden muss.

0
Dinesh