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

Boost C++ Discussion :

boost timer vs sleep + while(1)


Sujet :

Boost C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut boost timer vs sleep + while(1)
    Salut,

    Quel est l'avantage d'utilisre un boost::timer dans un thread plutôt que la combo sleep+while dans un thread

    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
    20
    21
     
    void print(const boost::system::error_code& /*e*/,boost::asio::deadline_timer* t,int* count)
    {
      if (*count < 5)
      {
        std::cout << *count << "\n";
        ++(*count);
        t->expires_at(t->expires_at() + boost::posix_time::seconds(5));
        t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count));
      }
    }
     
     
    int main(int argc, char *argv[])
    { 
        int count = 0;
        boost::asio::io_service io;
        boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
        t.async_wait(boost::bind(print,boost::asio::placeholders::error, &t, &count));
        boost::thread(boost::bind(&boost::asio::io_service::run,&io));
    }

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Je pense aucun. A moins que boost utilise les timer système ?
    Sa évite quand même d'écrire soi même la fonction de thread.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    oui mais écrire soit même la fonction de thrad revient à faire :

    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
    void print( )
    {
     int i = 0;
      while(i<5)
      {
        std::cout << i << "\n";
        ++i;
        sleep(5000); //ou équivalent boost
      }
    }
     
     
    int main(int argc, char *argv[])
    {    
        boost::thread( boost::bind(print) );
    }

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    euh sleep c'est de l'attente active, c'est genre infame

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    comment est ce qu'une attente inactive est gérée, je connaissais pas du tout cette notion?

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Par défaut
    Citation Envoyé par Joel F Voir le message
    euh sleep c'est de l'attente active, c'est genre infame
    Par active, tu entend que du cpu est consommé ?

    Il me semblait qu'un thread "endormi" ne consommait pas de cpu.

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    sleep n'endort pas le thread non ?

  8. #8
    Membre très actif Avatar de Firwen
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2009
    Messages : 472
    Par défaut
    (m)/(u) sleep, dans le version POSIX du moins, n'est pas de l'attente active non. Il relache le proco.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    j'acquiesse

  10. #10
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Citation Envoyé par Joel F Voir le message
    sleep n'endort pas le thread non ?
    c'est exact ; l'exécution du thread courant est suspendue

  11. #11
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    OK

  12. #12
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ma question demeure

  13. #13
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    La question judicieuse serais de ce demander pourquoi on veux faire attendre un thread un temps X à chaque fois! Si c'est pour une question de synchro... beurk

  14. #14
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    par exemple pour recharger une donnée provenant d'une BDD toutes les 10 secondes

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    Quel est l'avantage d'utilisre un boost::timer dans un thread plutôt que la combo sleep+while dans un thread
    • sleep() est Posix et à ce titre pas forcément présent (de mémoire sous Windows il existe _sleep() et Sleep() mais pas sleep()), boost_timer fourni la couche d'abstraction.
    • Les timers boost ont une résolution meilleure que la seconde.

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    parfait merci

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Et si tu veux déclencher des fonctions, avec Boost, tu n'as qu'une seule boucle qui se charge de tout, tu n'es pas obligé d'avoir un thread pour chaque timer.

    Autre détail, tu déclenches un timer pour dans 5s avec Boost, tu travailles un bout de temps (genre 1s +/- 10%), ton prochain déclenchement sera dans 5s, pas dans 6s +/- 10%.

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    J'ai tendance à partager le réflexe premier de Joel pour dire qu'un while + sleep est une attente active même si le thread appelant sleep passe dans un état non schedulable.
    J'ai une approche extensive du 'actif' : le thread reste bloqué dans une attente alors qu'il pourrait être sollicité pour d'autres tâches pendant que celle ci attend gentiment son timer. Cette vision vient probablement des tâches en embarqué qui s'articulent sur une boucle de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tant que (1)
          Lecture bloquante Evenement (timer parmi les évènements ou sortie sur timer)
          Dispatch évènement
    fin tant que.
    Si un des objets gérant un évènement se met dans un while+sleep, alors on ne rentre plus dans la boucle de la tâche. D'autres évènements peuvent s'accumuler dans la file voir être perdus.
    D'où, un while+sleep ~ attente active => à éviter.

  19. #19
    Membre habitué
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Et si tu veux déclencher des fonctions, avec Boost, tu n'as qu'une seule boucle qui se charge de tout, tu n'es pas obligé d'avoir un thread pour chaque timer.

    Autre détail, tu déclenches un timer pour dans 5s avec Boost, tu travailles un bout de temps (genre 1s +/- 10%), ton prochain déclenchement sera dans 5s, pas dans 6s +/- 10%.
    Bonjour Matthieu,

    L'avantage que tu cite me semble très intéressant.
    Qu'entend par "une seule boucle" ? un seul thread ?

    Par rapport à ta deuxième partie, sais-tu comment cela est gérer ?

    Merci

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/01/2013, 10h11
  2. boost::timer trop lent.
    Par nuKs dans le forum Boost
    Réponses: 13
    Dernier message: 28/01/2011, 10h57
  3. [AJAX] AJAX, timer et boucle while
    Par podidoo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/03/2007, 20h36
  4. Timer ou sleep? Dur dur de choisir.
    Par Gaadek dans le forum Delphi
    Réponses: 8
    Dernier message: 30/10/2006, 09h47
  5. Sleep, Wait, Timer : que choisir ?
    Par Ender dans le forum Général VBA
    Réponses: 2
    Dernier message: 25/07/2006, 13h02

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