IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

pthread_create et argument int


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Par défaut pthread_create et argument int
    Bonjour,

    J'ai un petit souci en C sur linux avec la librairie pthread.

    J'essaie de passer aux thread que je créé leur id (int), pour ce faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main :
    -----------
    int n;
    n = ...
    pthread_create(&(clients[n].thread), NULL, handle_client, &n);
     
    void* handle_client(void * n)
    {
    	int position_n = *((int *) n);
    	....
    }
    Cela fonctionne 9x sur 10, mais j'ai l'impression que je reçois parfois la mauvaise valeur lors d'une série de créations (n varie à chaque fois).

    Malheureusement je ne sais pas trop comment tester vu qu'un printf peut avoir lieu avant un autre.

    J'ai cependant lu à quelque part qu'il fallait mettre de sleep après la création d'un thread ?!?! Est-ce correct ? est ce que mon problème peut venir de là ? ou de la façon par laquelle je passe mon paramètre ?

    Merci d'avance pour votre aide !!!

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 118
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    J'ai un doute sur le morceau de code que vous avez envoyé. ( Du coup, j'aurai préférré le vrai, mais bon)

    L'idée du sleep n'est peut être pas si mauvaise en y reflechissant, pourquoi?
    Voici ce que peux faire le programme ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int n = 43;
     
    // Création du thread on passe un pointeur sur n ( id = 1 )
    // -> Oops mon système a donné la main au père
    // Changement de n
    // Création du deuxième thread ( id = 2 )
    // 2 copie n dans la variable locale
    // -> Mon système met en pause 2, et repasse sur 1
    // 1 copie enfin n, qui, comme c'était un pointeur ... la valeur de n a été changé
    Voici un cas d'erreur ( qui arrivera un cas sur 10 ... )
    Je ne suis pas vraiment pour une solution avec un sleep. Juste l'utilisation de plus de variables peut être une bonne idée.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu dois sûrement essayer de modifier n dans plusieurs threads différents. Utilises les mutex pour être sûr que ta variable soit toujours 'valide'.

  4. #4
    Membre éclairé Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Par défaut
    Effectivement c'était plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while (1)
    {
    n = new_n(); // n tjs différent
    // accept socket
    pthread_create(&(clients[n].thread), NULL, handle_client, &n);
    }
    En ajoutant un mutex avant le n = new_n() et au début de ma fonction handle_client, il me semble que le problème ne survient plus.

    J'avais déjà essayé l'idée du mutex, mais je l'avais mis APRES le new_n() et non pas AVANT comme maintenant.

    En tout cas merci pour votre aide !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. argument int en c++
    Par loisir1976 dans le forum Débuter
    Réponses: 6
    Dernier message: 04/05/2009, 19h01
  2. passer un int en argument d'un thread
    Par romainromain dans le forum POSIX
    Réponses: 3
    Dernier message: 08/12/2006, 09h37
  3. un int en argument
    Par jomannix dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 21/09/2006, 14h40
  4. Réponses: 4
    Dernier message: 10/04/2006, 22h30
  5. Réponses: 2
    Dernier message: 14/01/2006, 09h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo