web-dev-qa-db-fra.com

pthread_detach question

Jusqu'à récemment, j'avais l'impression que si vous "détachez" un fil après l'avoir créé, le fil perdure même après la fin du fil "principal". 

Mais une petite expérience (listée ci-dessous) va à l’encontre de ma conviction. Je m'attendais à ce que le fil détaché continue à imprimer "Parler à partir du fil détaché" même après la fin de la tâche principale, mais cela ne semble pas se produire. L'application se termine apparemment ...

Les threads "détachés" meurent-ils après des problèmes "principaux" 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

Pour citer le Manuel du programmeur Linux :

L'attribut détaché simplement Détermine le comportement du système Lorsque le thread se termine; n'empêche pas le fil d'être arrêté de si le processus se termine en utilisant exit(3) (ou de manière équivalente, si le fil principal revient).

Également tiré du Manuel du programmeur Linux :

Pour permettre à d'autres threads de continuer l'exécution , Le thread principal doit se terminer en appelant pthread_exit() Plutôt que exit(3).

31
NPE

pthread_detach signifie simplement que vous ne rejoindrez plus jamais le fil. Cela permet à la bibliothèque pthread de savoir si elle peut immédiatement disposer des ressources de thread une fois que le thread est sorti (le cas détaché) ou si elle doit les conserver car vous pourrez ultérieurement appeler pthread_join sur le thread.

Une fois que principal retourne (ou quitte), le système d'exploitation récupère tous vos threads et détruit votre processus.

15
idz

pthread_detach ne fait pas ce que vous pensez, il indique à l'implémentation que l'espace utilisé par le thread avec l'ID spécifié peut être récupéré dès qu'il se termine, c'est-à-dire. aucune opération pthread_join ne sera effectuée dessus.

Tous les threads sont terminés une fois que le processus les contenant est terminé.

5

Oui, les threads détachés mourront après return 0.

Dans la section NOTES de man pthread_detach

L'attribut détaché simplement Détermine le comportement du système Lorsque le thread se termine; n'empêche pas le processus d'être arrêté si le processus se termine par à l'aide de exit (3) (ou de manière équivalente si est renvoyé par le processus principal)

1
freethinker

De man pthread_detach:

La fonction pthread_detach() marque le thread identifié par le thread comme étant détaché. Lorsqu'un thread détaché se termine, ses ressources sont automatiquement libérées sur le système sans qu'il soit nécessaire qu'un autre thread se joigne au thread terminé.

0
Dinesh