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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

  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
    parfait merci

  10. #10
    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%.

  11. #11
    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.

  12. #12
    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