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 :

boos::asio asynchrone mais io.run() bloquant


Sujet :

Boost C++

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut boos::asio asynchrone mais io.run() bloquant
    Bonjour,

    Jusqu'à présent je me servais des sockets synchrone de boost, j'essaye d'utiliser les socket asynchrones via les fonctions async_(read/write/connect) et io.run()

    Là ou je ne comprends plus, c'est que l'intérêt que je voyais dans l'utilisation des socket asynchrones étaient le faite de ne pas avoir à gérer un thread et que cela ne rendait pas pour autant le thread principal de l'application bloquant.

    Mais il n'en est rien car le système des socket asynchrone de boost passe par l'appel à io.run() qui lui est bloquant...

    Faut-il donc créer un thread dans lequel s'éxécute io.run() pour ne pas rendre son thread principal bloquant ?


    AI-je louper une étape/mal compris un concept ?

    Merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Citation Envoyé par guillaume07 Voir le message
    Faut-il donc créer un thread dans lequel s'éxécute io.run() pour ne pas rendre son thread principal bloquant ?
    Oui.

    Citation Envoyé par guillaume07 Voir le message
    AI-je louper une étape/mal compris un concept ?
    En fait tu peux créer autant de threads que tu veux et les "confier" à Boost.Asio en leur faisant appeler io.run().
    Boost.Asio ne crée pas de threads, d'ailleurs comment pourrait-il ? Leur nombre et réglages dépendent tellement de l'utilisation qu'on en fait.

    MAT.

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Boost.Asio ne crée pas de threads, d'ailleurs comment pourrait-il ? Leur nombre et réglages dépendent tellement de l'utilisation qu'on en fait.
    Disons que Boost.Asio en crée en interne pour émuler l'asynchronicité ...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par poukill Voir le message
    Disons que Boost.Asio en crée en interne pour émuler l'asynchronicité ...
    Oui c'est vrai, en effet, il *peut* en créer en interne dans son implémentation.

    Cf. le point dont on parle dans la doc.

    MAT.

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    "Multiple threads may call io_service::run()"

    ça veut dire qu'on peut appelé io.run() plusieurs fois pour la meme socket ??

  6. #6
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    io.run() lance la boucle d'evenement. TU peux lancer la boucle d"evenement sur n threads, et dans ce cas la, asio va dispatcher les differents jobs sur les threads, de maniere automatique. Si tu n'a qu'un seul socket, ce n'est probablement pas tres utile.

  7. #7
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    +1
    De tête c'est qqchose comme ça :
    Asio sur un seul thread. (largement suffisant pour une socket)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      asio::io_service io_service;
     
      // donner du travail à io_service
       // ...
     
      boost::thread t(&asio::io_service::run, &io_service);
    Asio avec un threadpool :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       asio::io_service io_service;
      //... donner du travail à io_service
      //...
     
      boost::thread_group threads;
      for (std::size_t i = 0; i < my_thread_count; ++i)
        threads.create_thread(boost::bind(&asio::io_service::run, &io_service));

  8. #8
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par Arzar Voir le message
    +1
    De tête c'est qqchose comme ça :
    Asio sur un seul thread. (largement suffisant pour une socket)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      asio::io_service io_service;
     
      // donner du travail à io_service
       // ...
     
      boost::thread t(&asio::io_service::run, &io_service);
    Asio avec un threadpool :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       asio::io_service io_service;
      //... donner du travail à io_service
      //...
     
      boost::thread_group threads;
      for (std::size_t i = 0; i < my_thread_count; ++i)
        threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
    ok très bien c'est ce que j'avais compris. J'ai par ailleurs essayé cette syntaxe avec un async_timer mais sans succés, le callback du timer ,n'était jamasi appelé soit dois marcher en théorie ?

Discussions similaires

  1. Différence entre Asynchrone et modèle non bloquant
    Par unoomad dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2014, 14h02
  2. Réponses: 2
    Dernier message: 20/08/2008, 16h21
  3. Run application OK mais pas en mode debug
    Par khamed dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/10/2007, 16h42
  4. [C# 2.0]Thread externe mais bloquant main interface
    Par Psykotik dans le forum Windows Forms
    Réponses: 13
    Dernier message: 31/08/2007, 09h59
  5. getresource mais pas en run time
    Par fétémété dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 05/03/2007, 12h07

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