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 confirm� Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    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 : 51
    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
    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 confirm� Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    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