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::asio] Lire et écrire simultanément sur un tcp::iostream


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut [boost::asio] Lire et écrire simultanément sur un tcp::iostream
    Bonjour,

    Je butte actuellement sur un problème de lecture/écriture concurrente avec un boost::asio:ip::tcp::iostream. L'écriture sur une instance de cette classe est bloquante tant qu'une lecture (bloquante elle aussi) est en cours.

    Si j'ai bien compris, c'est une limitation du iostream encapsulant le streambuf TCP. La sentry associée veille à ce que le streambuf soit accédé de manière exclusive. Ca me choque un peu dans la mesure où les zones get & set d'un streambuf ne constituent pas forcément une même fifo (et même si c'était le cas on pourrait imaginer un comportement non bloquant) mais, si je ne me suis pas mélangé les pinceaux, c'est pourtant bien ce qui se passe.

    Il est néanmoins possible de lire et d'écrire simultanéement sur une socket boost (le streambuf TCP gérant bien deux buffers décorélés) alors pourquoi ce comportement de la part d'un boost::asio:ip::tcp::iostream ? Il y aurait-il un moyen de construire un iostream permettant lecture et écriture simultanées ?

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Salut,

    1/ En protégeant avec un mutex tu ne peux pas lire et écrire (chacun son tour) comme tu le souhaites ?

    2/ async_read et async_write ne sont pas bloquant, il me semble, donc tu dois pouvoir creuser dans cette voie-là.

  3. #3
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par Alp Voir le message
    1/ En protégeant avec un mutex tu ne peux pas lire et écrire (chacun son tour) comme tu le souhaites ?
    Malheureusement la lecture est bloquante. En fait, j'ai un thread qui lit en boucle des blocs de tailles variables (les appels étant bloquants tant que le réseau n'a pas fournit assez de données).

    L'écriture se fait de temps en temps dans un autre thread mais a donc toujours lieu, sauf coup de chance, durant un appel bloquant en lecture du thread précédent.

    Citation Envoyé par Alp Voir le message
    2/ async_read et async_write ne sont pas bloquant, il me semble, donc tu dois pouvoir creuser dans cette voie-là.
    Ca m'obligerait à gérer moi-même l'aspect bloquant (dont j'ai besoin, c'est un stream après-tout). Mais pourquoi pas, ça peut être plus clean que la solution ci-dessous :

    la seule solution que j'ai réussie à trouver depuis peu est de créer un istream et un ostream avec chacun leur propre streambuf mais qui pointent sur un même socket en interne (ce streambuf est une classe à moi). La seule raison qui m'oblige à avoir deux streambuf distincts est d'éviter le lock (c'est le streambuf qui sert de clef).

    Ca fontionne mais il faut encore que je vois si c'est vraiment complétement sécurisé d'un point de vue multithreads (et puis ça reste un peu lourd d'avoir ces duplications).

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Et si un thread écrit dans le socket pendant qu'un autre thread lit le socket... quelle maitrise as-tu sur le comportement ainsi induit ?

  5. #5
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par Alp Voir le message
    Et si un thread écrit dans le socket pendant qu'un autre thread lit le socket... quelle maitrise as-tu sur le comportement ainsi induit ?
    En fait, mon streambuf est réentrant donc, si le asio::ip::tcp::socket est thread-safe, mon streambuf l'est aussi. La question devient donc : peut-on lire et écrire simultanément dans un tel socket sans problème ?

    En pratique, ça marche mais, dans l'absolu, ça reste à prouver. Personnellement, je n'utilise asio que depuis très peu de temps et je ne peux rien affirmer. En particulier, je ne sais pas si les strands sont juste là pour faciliter le multi-threads ou sont en fait nécessaire pour en faire.

Discussions similaires

  1. Lire et écrire dans un socket TCP unique
    Par Khan34 dans le forum C++
    Réponses: 4
    Dernier message: 15/03/2012, 14h17
  2. [VB6] Lire et écrire sur une fenêtre dos...
    Par Zenar dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 16/03/2008, 13h14
  3. Lire et écrire sur le post COM sous XP
    Par ishikawa dans le forum C
    Réponses: 4
    Dernier message: 04/04/2007, 17h23
  4. Réponses: 3
    Dernier message: 24/01/2005, 00h27
  5. [OS] Lire et écrire sur disquette
    Par trax44 dans le forum Programmation d'OS
    Réponses: 17
    Dernier message: 22/02/2004, 20h45

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