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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    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 : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    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..) :-)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    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 : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    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 :-)

  5. #5
    Membre éclairé

    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 : 44
    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
    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é ...

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    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 Expert

    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
    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 "

  8. #8
    Membre éclairé

    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 : 44
    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
    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 ...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 101
    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 ?

  10. #10
    Membre chevronné
    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
    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