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 :

thread pool et submit(fonction)


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut thread pool et submit(fonction)
    Bonsoir,

    Je me suis inspiré d'un code source pour un thread pool qui est fourni dans "C++ Concurrency in Action: Practical Multithreading" d'Anthony Williams.
    MAIS, en voulant ajouter un argument à la fonction qui estmise dans la queue des tâches, le programme bute sur la syntaxe...

    Dans le code ci-dessous, imaginons que la fonction XYZ prend en argument l'indice de la boucle pour l'imprimer à l'écran.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // -----Fonction XYZ 
    void XYZ(int x){
    std::cout<<"x=" << x <<  std::endl;
    }
     
    // ----- Création du Thread Pool et boucle de mise en queue d'un fonction XYZ 
    threadPool* tPool = new threadPool();
    for(int i=0; i<100; ++i) 
    tPool->submit(XYZ, i);
    delete tPool;
    Dans l'objet threadPool, j'essaie plusieurs formules (en commentaire dans le code suivant).
    Comme message d'erreur j'obtiens :
    NO MATCHING FUNCTION FOR CALL TO INVOKE
    ou alors
    EXPRESSION CONTAINS UNEXPANDED PARAMETER PACK 'arg1'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename FunctionType, typename... Args>
    		void submit(FunctionType f, Args&&... arg1){
    		   //	workQueue.push(std::bind(f, std::forward<Args>(arg1)...));
    		 //  	workQueue.push( std::bind(f, std::ref(arg1) ));
    			}
    Une suggestion ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Sans avoir le prototype de la ou des fonctions push(), c'est difficile de répondre.
    On pourrait peut-être écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename FunctionType, typename... Args>
    void submit( FunctionType&& f, Args&&... arg1 ) {
        workQueue.push( std::forward<FunctionType>(f), std::forward<Args>(arg1)... );
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Vu le nom workQueue, je suppose qu'il s'agit d'une std::queue<std::thread>.
    Le problème ici est que le constructeur de la classe std::thread est marqué explicit. Il ne peut donc pas y avoir de conversion implicite depuis le callable retourné par std::bind() vers le std::thread attendu par std::queue::push().

    Tu peux utiliser std::queue::emplace() à la place qui va construire le std::thread avec les paramètres que tu lui passeras.

  4. #4
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Ah pardon, le prototype de push :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		void push(T newValue){
    			std::lock_guard<std::mutex> lk(mut);
    			dataQueue.push(std::move(newValue));
    			dataCond.notify_one();
    			}

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    On progresse, push() attend un T. Et T c'est quoi?
    Il faudrait peut-être aussi l'erreur complète, elle doit indiquer la ligne qui a provoqué l'erreur.

  6. #6
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Bonjour,
    Le header pour mon thread queue est le suivant
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    template<typename T>
    class threadSafeQueue{
    	private:
    		mutable std::mutex mut;
    		std::queue<T> dataQueue;
    		std::condition_variable dataCond;
    	public:
    		threadSafeQueue(){}
    		void push(T newValue){
    			std::lock_guard<std::mutex> lk(mut);
    			dataQueue.push(std::move(newValue));
    			dataCond.notify_one();
    			}
    		void wait_and_pop(T& value){
    			std::unique_lock<std::mutex> lk(mut);
    			dataCond.wait(lk, [this]{return !dataQueue.empty();});
    			value=std::move(dataQueue.front());
    			dataQueue.pop();
    			}
    		std::shared_ptr<T> wait_and_pop(){
    			std::unique_lock<std::mutex> lk(mut);
    			dataCond.wait(lk, [this]{return !dataQueue.empty();});
    			std::shared_ptr<T> res(std::make_shared<T>(std::move(dataQueue.front())));
    			dataQueue.pop();
    			return res;
    			}
    		bool try_pop(T& value){
    			std::lock_guard<std::mutex> lk(mut);
    			if(dataQueue.empty()) return false;
    			value=std::move(dataQueue.front());
    			dataQueue.pop();
    			return true;
    			}
    		std::shared_ptr<T> try_pop(){
    			std::lock_guard<std::mutex> lk(mut);
    			if(dataQueue.empty()) return std::shared_ptr<T>();
    			std::shared_ptr<T> res(std::make_shared<T>(std::move(dataQueue.front())));
    			dataQueue.pop();
    			return res;
    			}
    		bool empty() const{
    			std::lock_guard<std::mutex> lk(mut);
    			return dataQueue.empty();
    			}
    };

  7. #7
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Bonjour WinJerome,
    J'essaie avec emplace au lieu de push mais j'obtiens l'erreur suivante :
    no member named 'emplace' in 'threadSafeQueue<std::function<void ()> >'

Discussions similaires

  1. Lancer plusieur thread sur la meme fonction
    Par daviddu54 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/01/2008, 11h34
  2. Plusieurs thread et une meme fonction
    Par azmimik dans le forum Général Python
    Réponses: 2
    Dernier message: 03/08/2007, 23h32
  3. Réponses: 1
    Dernier message: 09/08/2006, 16h04
  4. [Thread]Pool de threads
    Par rlnd23 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 14/02/2006, 16h01
  5. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    Réponses: 19
    Dernier message: 17/08/2004, 14h12

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