Question pthread_create
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Question pthread_create



  1. #1
    SEIYA00

    Question pthread_create


    ------

    Bonjour,

    J'ai besoins de votre aide car je dois utiliser la foncion pthread_create mais a chaque fois que je l'utilise il met met cette erreur:

    "error: passing argument 3 of ‘pthread_create’ from incompatible pointer type
    /usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(int)’
    make: *** [cnct.o] Erreur 1"

    Voici le code :
    (le contenu de la fonction repeater n'est pas très important, j'utilise pthread_create dans manage_cnct)
    Code:
    /* Cr�ation d'un client */
    /* Version stupide. Pas de creation de thread, 
       Le serveur ne peut plus accepter de connexion car il g�re
       l'interaction avec le premier client. 
    */
    int manage_cnct(int fd)
    
    {
      int c;
      pthread_t t1;
    
    
        pgrs_in();
    
    
    pthread_create(&t1,NULL,&repeater,(void*)fd);
    pthread_join(t1,(void**)&c);
    
    if (c==-1)
      
    {
      printf ("la fonction repeateur s'est mal passée"); 
    }
    
        pgrs_out();
    
    }
    
    static int sockets[MAX_CONNECTION]; /* tableau initialis� a zero */
    
    static void
    add_socket(int fd)
    {
        int i;
        
        pgrs_in();
        for (i=0; i<MAX_CONNECTION; i++) {
    	if (sockets[i] == 0) {
    	    sockets[i] = fd;
    	    break;
    	}
        }
        assert(i!=MAX_CONNECTION);
        pgrs_out();
    }
    
    static void
    del_socket(int fd)
    {
        int i;
        
        pgrs_in();
        for (i=0; i<MAX_CONNECTION; i++) {
    	if (sockets[i] == fd) {
    	    sockets[i] = 0;
    	    break;
    	}
        }
        assert(i!=MAX_CONNECTION);
        pgrs_out();
    }
    
    /* Un client  */
    static void
    repeater(int sckt)
    {
        char buf[MAX_BUFFER];
        int nbc, i;
        const char WELCOME[] = "mtcs : bienvenu\n";
    
        pgrs_in();
        write(sckt, WELCOME, strlen(WELCOME));
    
        pgrs("enregistrement d'une socket");
        add_socket(sckt);
        
        while (1) {
    	pgrs("attente read");
    	nbc = read(sckt, buf, MAX_BUFFER);
    	if (nbc <= 0) {
    	    pgrs("fin lecture client");
    	    pgrs("desenregistrement d'une socket");
    	    del_socket(sckt);
    	    close(sckt);
                pgrs_out();
    	    return;
    	}
    	pgrs("boucle ecriture");
    	for(i=0; i<MAX_CONNECTION; i++)
    	    if (sockets[i])
    		write(sockets[i], buf, nbc);
    	pgrs("fin boucle ecriture");
        }
    }
    
    /* Cr�ation d'un client */
    /* Version stupide. Pas de creation de thread, 
       Le serveur ne peut plus accepter de connexion car il g�re
       l'interaction avec le premier client. 
    */
    int manage_cnct(int fd)
    
    {
      int c;
      pthread_t t1;
    
    
        pgrs_in();
    
    
    pthread_create(&t1,NULL,&repeater,(void*)fd);
    pthread_join(t1,(void**)&c);
    
    if (c==-1)
      
    {
      printf ("la fonction repeateur s'est mal passée"); 
    }
    
        pgrs_out();
    
    }
    J'ai passer 2 heure a modifier mon code pour que ca marche mais rien n'y fait, j'ai aussi chérché des exemple d'utilisation de pthread_create sur le net mais ca ne m'a pas aidé non plus.

    Merci d'avance pour vos réponses

    -----
    Dernière modification par SEIYA00 ; 23/03/2012 à 12h22.

  2. #2
    invite765732342432
    Invité

    Re : Question pthread_create

    Citation Envoyé par SEIYA00 Voir le message
    "error: passing argument 3 of ‘pthread_create’ from incompatible pointer type
    /usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(int)’
    make: *** [cnct.o] Erreur 1"
    L'erreur est relativement claire: l'argument n°3 (c'est à dire la fonction) n'est pas du bon type.
    La fonction utilisée doit accepter un void* en paramètre et retourner un void*. Ce n'est pas le cas de la fonction repeater.

    Est-ce que tu vois comment corriger ?
    Dernière modification par invite765732342432 ; 23/03/2012 à 12h27.

  3. #3
    SEIYA00

    Re : Question pthread_create

    merci de m'avoir répondu aussi rapidement. Normalement il suffit que je modifie le type de repeater en métant


    void* repeateur(int fd)
    {

    ...

    return(0); ou return (void*)0;
    }
    Dernière modification par SEIYA00 ; 23/03/2012 à 14h17.

  4. #4
    invite765732342432
    Invité

    Re : Question pthread_create

    C'est mieux, mais pas encore ça...
    int fd n'est pas bon: il te faut un void *

    Si tu veux un int à l'intérieur de ta fonction, il faudra caster ce void * en int.

  5. A voir en vidéo sur Futura
  6. #5
    SEIYA00

    Re : Question pthread_create

    MERCIIIII c'était éxactement ca le problème. Ca a marché tout de suite une fois que j'ai fait tout ca. MERCI d'avoir pris le temps de m'aider

Discussions similaires

  1. question stupide mais question quand même
    Par invite18e057a8 dans le forum Orientation avant le BAC
    Réponses: 6
    Dernier message: 20/02/2008, 15h15
  2. Ptite question sur une question de géo3D : Asie 06
    Par invitefc60305c dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 01/06/2007, 13h51
  3. Question sur une question ( algèbre lin.)
    Par invite2dc206d9 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 13/10/2006, 23h39
  4. Question sur VCO dans ce schéma (et autre question)
    Par freesbeep dans le forum Électronique
    Réponses: 0
    Dernier message: 08/12/2005, 22h01