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 :

[C++11] utilisation de nombreux threads


Sujet :

Threads & Processus C++

  1. #1
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut [C++11] utilisation de nombreux threads
    Bonjour,

    Je suis en train de fabriquer un simulateur multi-agent multithreader.
    Je lance donc 5000 threads, un pour chaque agent. Il se trouve que le lancement des threads est très lent (350 ms).
    Je cherche donc à stocker mes agents dans un vector puis de les lancer plus tard.

    voici un code minimal :
    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
    #include <iostream>
    #include <thread>
    #include <vector>
    #include <chrono>
     
    void agent()
    {
    	int cmp = 0;
    	for (int i=0; i< 100; ++i)
    		++cmp;
    }
     
     
    int main(int argc, char* argv[]) 
    {
    	auto start_time=std::chrono::high_resolution_clock::now(), end_time=std::chrono::high_resolution_clock::now();
     
     
    	std::vector<std::thread> vt;
    	start_time = std::chrono::high_resolution_clock::now();
     
    	for (int i=0; i<5000; ++i)
    		vt.push_back(std::thread(agent));
     
    	end_time = std::chrono::high_resolution_clock::now();
    	std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count() << ":";
     
     
    	for (std::vector<std::thread>::iterator it = vt.begin(); it != vt.end(); ++it)
    		(*it).join();
     
    	return EXIT_SUCCESS;
    }
    Voici ce que j'aimerais obtenir :
    - création des 5000 threads dans un vector (sans les lancer)
    - lancer les 5000 threads.
    - les relancer quand les 5000 ont finis
    - les relancer quand les 5000 ont finis
    - les relancer quand les 5000 ont finis
    - les relancer quand les 5000 ont finis
    - les relancer quand les 5000 ont finis

    Je n'arrive pas à trouver une fonction pour relancer les threads.

    Merci d'avance pour votre aide
    Robin

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est souvent une mauvaise idée : Les OS ont des limites quant au nombre de threads simultanés existants, et la création d'un thread est une opération lourde qui ne se justifie que si l'on effectue un nombre important d'opérations dedans. Certaines bibliothèques (TBB, PPL) fournissent la notion de task, adaptées à de petits traitements, pouvant être crées en grand nombre, et qui se partagent un faible nombre de threads en les réutilisant (de l'ordre de un thread par cœur).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Merci beaucoup pour cette réponse rapide

    Voici le nouveau code :
    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
    #include <iostream>
    #include <thread>
    #include <vector>
    #include <chrono>
    #include <tbb/tbb.h>
     
    using namespace tbb;
     
     
    void agent(int i)
    {
    	int cmp = 0;
    	for (int i=0; i< 1000; ++i)
    		++cmp;
    }
     
    int main(int argc, char* argv[]) 
    {
    	std::chrono::system_clock::time_point start_time, end_time;
     
    	while(1)
    	{
    		start_time = std::chrono::high_resolution_clock::now();
    		parallel_for(0, 100000, 
    			[&](int i) 
    			{
    				agent(i);
    			} 
    		);
    		end_time = std::chrono::high_resolution_clock::now();
    		std::cout <<"all block"<< std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count() << std::endl;
    	}
     
    	return EXIT_SUCCESS;
    }
    Je peut maintenant lancer 100 000 agents en temps réel en mode debug
    Merci beaucoup !

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

Discussions similaires

  1. [LINUX][JVM][APACHE][TOMCAT]Ouverture de nombreux threads
    Par tibo007 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/01/2007, 10h48
  2. Utilisation d'un thread pour faire une pause.
    Par ropabo dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 11/06/2006, 14h28
  3. utilisation du Multi threading
    Par chti_juanito dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 30/05/2006, 10h20
  4. [JProgressBar] Utilisation d'un thread
    Par GLDavid dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 16/01/2006, 11h17
  5. [C# 2.0][Form]Comment utiliser les Delegates & Threading
    Par Tips dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/01/2006, 14h22

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