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

C Discussion :

problème de sleep bloquant


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET/C/C++
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET/C/C++
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Par défaut problème de sleep bloquant
    Bonjour à tous.
    Voilà, j'ai actuellement un problème avec une appli sous Linux dans laquelle j'appelle la méthode sleep.
    Le problème est simple, c'est que le code si situant après le sleep n'est jamais exécuté.
    Pour info, j'utilise 2 threads, et je fais mon sleep dans le fils. Si je fait un sleep dans le thread principal, ça fonctionne.

    Qqn a une idée?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Par défaut
    Bonjour,

    Il me semble que l'emploi de sleep n'est pas recommandé avec l'usage des threads.

    Essaye avec nanosleep qui fonctionne sans problème avec les threads

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par philippe_21 Voir le message
    Bonjour,

    Il me semble que l'emploi de sleep n'est pas recommandé avec l'usage des threads.

    Essaye avec nanosleep qui fonctionne sans problème avec les threads
    Non, l'emploi de sleep() ne pose aucun problème avec les threads:
    The sleep() function shall cause the calling thread to be suspended from execution until either the number of realtime seconds specified by the argument seconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Par défaut
    Bonjour Nicolas,

    effectivement je viens de vérifier avec man, les threads ne sont pas mentionnés. La seule mise en garde concerne l'utilisation conjointe de la fonction alarm() et sleep(), mais ceci nous écarte de la question initiale de bountykiler.

    Un exemple de son code nous permettrait peut être de l'aider.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET/C/C++
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET/C/C++
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Par défaut
    En gros, le code est comme ceci:
    (Ps: Si le code comporte du C++, c'est normal. Inutile de me faire des remarques du style "C'est pas bien", le code était comme cela quand j'ai commencer à travailler dessus.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void MaClasse::funcA()
    {
    pthread_t thread;
    pthread_create(&thread, NULL, this->funcB, NULL);
    pthread_detach(&thread);
    }
     
    static void* MaClasse::funcB(void* useless)
    {
    int delay = 10;
    while(true)
    {
        std::cout << "Sleeping" << std::endl;
        sleep(delay);
        std::cout << "Awaken" << std::endl;
    }
    return NULL;
    }
    Comme vouvous en doutez, le texte Sleeping s'affiche, par contre le texte Awaken ne s'affiche pas une seule fois.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Premièrement, oui, c'est un forum C, et oui c'est stupide de poser une question pour un code C++ sur un forum C.
    Deuxièmement, en imaginant que le code C++, ait le même comportement que du code C, je ne vois rien dans ton appel à sleep() qui cloche à première vue mais:
    Troisièmement, une des règles de base de tout forum est de poster un code minimal qui reproduise le problème et surtout qui compile. Qui me dit que ton thread principal ne fait pas un exit() ou un return pendant que tu fais ton sleep()?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur .NET/C/C++
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET/C/C++
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Par défaut
    Bon, ben pour finir et comme souvent des ces cas la, la vérité est ailleurs :-D.
    Au final, il apparait que le problème vient du fait que l'on fait un fork après avoir créé mon thread. Du coup, celui-ci est tué et n'est pas relancé.

    La solution est donc de différer mon traitement et la création de mon thread pour que le fork se fasse avant.

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

Discussions similaires

  1. problème de fifo bloquant sous linux
    Par Fonzy007 dans le forum POSIX
    Réponses: 6
    Dernier message: 20/05/2009, 09h44
  2. problème simple mais bloquant
    Par marianna dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 13/05/2008, 13h31
  3. Problème de sessions bloquantes
    Par Z3phur dans le forum Administration
    Réponses: 3
    Dernier message: 22/02/2008, 09h02
  4. Problème TCP non bloquant sous Linux (C++)
    Par jmelyn dans le forum Linux
    Réponses: 4
    Dernier message: 15/11/2007, 14h27
  5. problème de sleep()
    Par john93 dans le forum C++
    Réponses: 8
    Dernier message: 29/03/2007, 18h44

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