3 votes

Linux 2.6.30 uClibc 0.9.29 pthread_create two treads instead just one

Situation absolument étrange lors de la création d'un thread, voici le code de test :

#include <stdint.h>         /* C99 types */
#include <stdbool.h>        /* bool type */
#include <stdio.h>          /* printf, fprintf, snprintf, fopen, fputs */

#include <string.h>         /* memset */
#include <signal.h>         /* sigaction */
#include <time.h>           /* time, clock_gettime, strftime, gmtime */
#include <sys/time.h>       /* timeval */
#include <unistd.h>         /* getopt, access */
#include <stdlib.h>         /* atoi, exit */
#include <errno.h>          /* error messages */
#include <math.h>           /* modf */
#include <assert.h>

#include <sys/socket.h>     /* socket specific definitions */
#include <netinet/in.h>     /* INET constants and stuff */
#include <arpa/inet.h>      /* IP address conversion stuff */
#include <netdb.h>          /* gai_strerror */

#include <pthread.h>
void thread_up(void) {
        printf("thread ....\n");
        int loop=0;
        while(loop<=7)
        {
                printf("loop...\n");
                sleep(10);
                loop++;
        }
        printf("Exit loop\n");
}
int main()
{
pthread_t thrid_up=0;

        int i = pthread_create( &thrid_up, NULL, (void * (*)(void *))thread_up, NULL);
        if (i != 0) {
                printf("ERROR: [main] impossible to create upstream thread\n");
                exit(1);
        }
        while(1)
        {
                sleep(10);
        }

}

ce code produit la sortie suivante sur la commande ps (après le lancement de ./test&) :

30214 root        704 S   ./test
30215 root        704 S   ./test
30216 root        704 S   ./test

Un indice ?

4voto

Serhio Points 1

Juste une remarque. homme 7 pthreads

LinuxThreads

Les caractéristiques notables de cette mise en œuvre sont les suivantes :

  • I crée à l'aide de pthread_create(3) , crée un thread "manager". Ce thread s'occupe de la création et de la et l'arrêt des threads. (Des problèmes peuvent survenir si ce thread est tué par inadvertance).
  • Les threads ne partagent pas d'identifiants de processus. (En effet, les threads LinuxThreads sont implémentés comme des processus qui partagent plus d'informations plus d'informations que d'habitude, mais qui ne partagent pas d'identifiant de processus commun). Les threads LinuxThreads (y compris le thread du gestionnaire) sont visibles en tant que processus distincts en utilisant ps(1) .

Indépendamment du fait que ce document concerne la Glibc, votre version uClibc peut utiliser LinuxThreads comme "backend" de pthread. Techniquement, votre code peut donc créer trois entités d'ordonnancement.

Mais avant tout, vous devez vous assurer que ps imprime les threads, et pas seulement les processus, et vérifie qu'il n'y a qu'une seule instance lancée de votre programme pendant le sondage.

P.S. Vous devriez également vérifier que votre uClibc utilise réellement LinuxThreads et non NPTL. Ainsi, la possibilité d'observer trois threads existe, mais elle est très faible.

2voto

LPs Points 2090

ps vous montre le processus, pas les fils.

Il est probable que vous n'ayez lancé que 3 fois votre application en utilisant ./test &

Pour le tester, il faut tuer tous les processus en utilisant : killall test

Recommencez donc votre processus et voyez le résultat : ps -A | grep test Il vous montrera un exemple de test

Puis en utilisant : ps -eLf | grep test vous verrez des fils de test .


EDIT

En ce qui concerne la réponse de @Serhio, c'est probablement correct, en regardant dans les sources de uClibc à ce lien vous pouvez trouver, dans le répertoire libpthread, que LinuxThreads est utilisé, et donc qu'un gestionnaire de threads est ajouté.

0voto

queifaro Points 21

Oui... c'est vrai (@Serhio et @LPs)... ma uClibc utilise le gestionnaire que je viens de vérifier.

Malheureusement mon ps est très faible à cause de l'environnement linux embarqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X