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

Threads & Processus C++ Discussion :

Meilleure méthode pour gérer une ressource statique coûteuse d'une classe ?


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Par défaut Meilleure méthode pour gérer une ressource statique coûteuse d'une classe ?
    J'ai créé une classe A qui a besoin d'une ressource r commune à toutes les instances, dans un projet multithread. Cette ressource est coûteuse en cpu pour être construite, et aussi en mémoire.

    J'ai donc mis cette ressource dans une classe à part, et je la construit dans le constructeur de A, à l'aide de std::call_once :

    A.cpp

    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
    22
    23
    #include <mutex>          // std::call_once, std::once_flag
    #include <new>
     
    std::once_flag A::is_R_CTORed, A::is_R_DTORed;
    R* A::r;
    size_t A::Qt = 0;
     
    A::A()
    {
        std::call_once(is_R_CTORed, [&]{
            r = new R();
        });
        Qt++;
    }
     
    A::~A() {
        Qt--;
        if (!Qt) {
            std::call_once(is_R_DTORed, [&]{
                delete r;
            });
        }
    }
    Mais cette construction n'est pas satisfaisante, car si dans l'applicatif, j'ai une transition avec zéro instances de la classe A, alors la ressource r est détruite, et n'est pas reconstruite lorsqu'une nouvelle instance de A est créée, à cause du call_once.

    J'aurais bien aimé pouvoir réinitialiser le std::once_flag A::is_R_CTORed dans le destructeur de A, et le std::once_flag A::is_R_DTORed dans le constructeur de A, ce qui aurait fait un hystérésis robuste je pense.

    1. Peut-on réinitialiser un std::once_flag ? apparemment non ?
    2. La ressource r étant propre à la classe A, la gérer à l'extérieur n'est pas très satisfaisant ?
    3. Je peux aussi ajouter une méthode à la classe A pour détruire la ressource r, à la fin de l'application ?
    4. Quelle est la mailleure façon de faire svp ?

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Pourquoi pas un unique_ptr static ?
    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
    22
    23
    24
    25
    26
    class A {
    private:
    	static std::mutex m_mutex;
    	static std::unique_ptr<int> m_resource; // la resource couteuse, ici un int
     
    	static int getResource() {
    		std::lock_guard<std::mutex> lock(m_mutex);
    		return *m_resource.get();
    	}
     
    	static void setResource(int val) {
    		std::lock_guard<std::mutex> lock(m_mutex);
    		*m_resource.get() = val;
    	}
     
    public:
    	int foo() const {
    		// utilisation
    		setResource(2);
    		return getResource();
    	}
    };
     
    // .cpp
    std::mutex A::m_mutex;
    std::unique_ptr<int> A::m_resource(new int(42));

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Par défaut
    Merci beaucoup Iradrille.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/12/2012, 20h46
  2. Réponses: 1
    Dernier message: 08/03/2010, 14h40
  3. Meilleur méthode pour gérer une liste des blocks
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 41
    Dernier message: 22/07/2008, 02h06
  4. Meilleur langage pour gérer une base SQL
    Par carmensam dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 01/05/2008, 17h24
  5. Meilleure méthode pour vider une JTable
    Par JamesP dans le forum Composants
    Réponses: 9
    Dernier message: 17/08/2007, 11h42

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