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

Linux Discussion :

Pthread et semaphores


Sujet :

Linux

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut Pthread et semaphores
    Bonjours à tous,

    Je programme depuis longtemps mes threads et leurs synchro à l'aide de la librairie pthread et des sémaphores. Seulement là je me heurte à un problème un peu particulier. Dans un programme à un moment donné je dois arrêter complètement un thread pour toujours (en l'occurence c'est dans la fonction main()). J'ai donc fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sem_t sync;
     
    sem_init(&sync, 0, 0);
    sem_wait(&sync);
    Ca marche très bien chez moi sur ma Slackware 9.1 en kernel 2.6.5. Seulement comme on est 2 sur ce projet j'ai envoié le source à l'autre personne et ce code ne marche pas et le sem_wait() retourne immédiatement ... ce qui est gênant. Son système est une Fedora core 1 en kernel 2.4.22. On y comprends plus rien et on commence à s'arracher les cheveux là

  2. #2
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    est-ce bien le seul endroit où tu utilise le sémaphore ?

    Sinon, tu peux aussi mettre le thread en attente avec la fonction pause(), qui en fait va mettre le thread en attente d'un signal...

    Sinon, tu peux peut-être mettre un peu plus de ton code (partie intéressante..) :-)
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Pour du code interressant moi je suis d'accord mais à part ce que j'ai mis avant je vois pas trop ...

    En gros ma fonction main analyse les arguments passé au programme, lance les threads en fonctions qui se chargent du reste mais pour éviter que tout se ferme je veux que le main() attendent indéfiniment (jusqu'à la fermeture de l'application en fait). Donc le code interressant serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //#include blabla ...
     
    int main(int argc, char *argv[])
    {
       // analyse de *argv[]
     
       //Maintenant on attends ...
        sem_t sync;    
        sem_init(&sync, 0, 0);
        sem_wait(&sync);
     
         return 0;
    }
    Bon je précise bien que chez moi sur ma slackware 9.1 kernel 2.6.5 ca marche niquel mais que sur fedora core 1 kernel 2.4.22 le sem_wait attends pas ...

    Ensuite oui c'est bien le seul endroit où j'utilise cette sémaphore là ...

    Je ne comprends absolument pas d'où viens le problème mais avec pause() ca fonctionne. Le plus bizarre est que derrière j'ai une énorme syncro à l'aide des sémaphore et ca marche bien ...

    Merci

  4. #4
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Tant mieux si ça fonctionna avec pause.. mais au vu de ce que tu me dis, je suis comme toi.. je me demande d'où ça vient :-)
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //#include blabla ...
     
    int main(int argc, char *argv[])
    {
       // analyse de *argv[]
     
       //Maintenant on attends ...
        sem_t sync;    
        sem_init(&sync, 0, 0);
        sem_wait(&sync);
     
         return 0;
    }
    C pas une bonne idée d'avoir deux kernel différents pour les applications p_thread, il y a eu pas mal de changement entre 2.4 et 2.6 pour les la norme posix 1.b
    Tu devrais appeler sem_destroy() avant de termirner l'application (a moins que tu ne l'ai pas ajouter ici).
    essaie de récupérer errno et de l'afficher.
    peut-être que ton process reçoit un signal système qui le fasse sortir de son attente.
    utilise sem_getvalue() pour savoir combien de jetons sont sur la sémaphore lorsque tu sort de ton attente.
    En eséprant t'avoir aidé ...
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  6. #6
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Euh, le sujet remonte à plus d'un an quand même...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Citation Envoyé par Pouic
    Euh, le sujet remonte à plus d'un an quand même...
    donc le sim_wait fonctionne "at vitam eternam "
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  8. #8
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    :o
    Je n'ai pas regardé les dates, sorry.
    Mais comme le sujet n'était pas marqué comme résolu j'ai tiré mes conclusions ...
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  9. #9
    Nouveau membre du Club Avatar de YASIR
    Profil pro
    Inscrit en
    Février 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 101
    Points : 25
    Points
    25
    Par défaut
    Bonjour, est-ce que quelqu'un pourrait me donner le meilleur cours selon lui sur les sémaphores, un cours complet, merci ?

    The computer has the intelligence of anyone who uses it


  10. #10
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Yabo Voir le message
    Bonjours à tous,

    Je programme depuis longtemps mes threads et leurs synchro à l'aide de la librairie pthread et des sémaphores. Seulement là je me heurte à un problème un peu particulier. Dans un programme à un moment donné je dois arrêter complètement un thread pour toujours (en l'occurence c'est dans la fonction main()). J'ai donc fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sem_t sync;
     
    sem_init(&sync, 0, 0);
    sem_wait(&sync);
    Un simple coup d'œil à la doc :
    Citation Envoyé par man sem_wait, The Single UNIX ® Specification, Version 2 Copyright © 1997 The Open Group
    Upon successful return, the state of the semaphore is locked and remains locked until the sem_post() function is executed and returns successfully.

    The sem_wait() function is interruptible by the delivery of a signal.
    RETURN VALUE
    The sem_wait() and sem_trywait() functions return zero if the calling process successfully performed the semaphore lock operation on the semaphore designated by sem. If the call was unsuccessful, the state of the semaphore is unchanged, and the function returns a value of -1 and sets errno to indicate the error.
    ERRORS
    ...
    The sem_wait() and sem_trywait() functions may fail if:
    ...
    [EINTR]
    A signal interrupted this function.
    Il faut penser à gérer les erreurs, notamment à tester les codes de retour!

    Le topic peut être marqué comme résolu...

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

Discussions similaires

  1. pthread.h/semaphore.h ordre de blocage et de reveil
    Par TabrisLeFol dans le forum Linux
    Réponses: 11
    Dernier message: 09/01/2007, 18h56
  2. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 12h46
  3. Semaphore (operation Z)
    Par zehle dans le forum Linux
    Réponses: 3
    Dernier message: 12/01/2005, 21h30
  4. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17
  5. Réponses: 4
    Dernier message: 27/08/2003, 21h34

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