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 :

Implémentation d'un "pool" ?


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Implémentation d'un "pool" ?
    Hello,

    J'ai une fonction qui, par des appels successifs, doit remplir un grand buffer (peu importe de quoi) par morceaux. Je crée donc un petit buffer et appelle la fonction dans une boucle en lui filant l'adresse du petit buffer. La fonction écrase le contenu, et une fois sorti de la fonction, je mets à jour le grand buffer en lui filant le petit buffer et un décalage d'indice idoine.

    J'aimerais dorénavant qu'elle soit appelée en multithread (à l'aide de Boost). je remplace la boucle par un compteur partagé qui s'incrémente. Ce n'est pas trop gênant de bloquer ce compteur par un mutex. La MAJ est rapide (je recopie el compteur dans une variable locale). En revanche, je ne veux pas bloquer tous les threads dès que l'un d 'entre eux veut remplir son petit buffer. Je pense donc avoir autant de petits buffer que je lance de threads, donc avoir un "pool" de petits buffers.

    Disons que j'ai un grand buffer d'une taille équivalente à 100 petits buffer. Je lance 4 threads pour exécuter la fonction de remplissage de buffer. Il faudrait donc un vecteur de 4 petits buckets. Dès qu'un thread rentre dans la fonction de MAJ, il en chope un, le bloque, le remplit, met à jour le grand buffer, et libère le petit buffer.

    Y a-t-il une méthode pour faire ce genre de truc ?

    Merci.

  2. #2
    Membre chevronné
    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 : 43
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    boost::pool ???

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonsoir,

    je suppose que ce qui prend du temps c'est le remplissage d'un petit buffer c.a.d. le calcul associé, alors que la recopie d'un petit dans le grand est quasi instantanée (genre memcpy) ?

    si la taille des informations qui seront placées dans le grand buffer (via un petit) est connue à l'avance (peut être même fixe) alors il est inutile de passer par un petit buffer et autant écrire directement dans le grand à partir de la bonne position => plus de problème de gestion des petits buffers

    sinon, pourquoi ne pas allouer un petit buffer pour chaque thread une fois pour toute lors de leur lancement ?

    sinon une gestion de protégée par un mutex de 'n' buffers libres avec une opération de prise et une de relachement est très simple à faire, la question porte sur cela ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    Je suppose que ce qui prend du temps c'est le remplissage d'un petit buffer c.a.d. le calcul associé, alors que la recopie d'un petit dans le grand est quasi instantanée (genre memcpy) ?
    Citation Envoyé par bruno_pages Voir le message
    si la taille des informations qui seront placées dans le grand buffer (via un petit) est connue à l'avance (peut être même fixe) alors il est inutile de passer par un petit buffer et autant écrire directement dans le grand à partir de la bonne position => plus de problème de gestion des petits buffers
    Certes, mais je dois simuler une API qui m'envoie en multithreads des petits buffers que je dois recopier.

    sinon, pourquoi ne pas allouer un petit buffer pour chaque thread une fois pour toute lors de leur lancement ?
    C'est effectivement ce à quoi j'avais pensé. Mais cela oblige le client à créer explicitement ces petits buffers, et à les détruire, et je me demandais s'il n'existait pas une méthode permettant au client de s'affranchir de ce souci.

    sinon une gestion de protégée par un mutex de 'n' buffers libres avec une opération de prise et une de relâchement est très simple à faire, la question porte sur cela ?
    Oui, mais voir ma réponse précédente.
    Je pensais que c'était un problème récurrent en multithreads, et que donc une solution plus aboutie existait.

    Il aurait fallu pouvoir filer à l'appel de boost::thread() une sorte de constructeur pour le thread...

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