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 :

éffectué un taitement parallèle


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Par défaut éffectué un taitement parallèle
    Bonjour les amis, et voilà une autre débutante qui a besoin de votre aide. j'ai une méthode dans une classe que je veux quelle s'exécute en parallèle a un nombre prédéfins de fois cette méthode va être déclencher chaque 5mn
    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
    for (int i= 1; i<=6 ; i++)
    {
    	ant_pkt ant_pkt(sourc, dest , 0, i );
    	int type = ant_pkt.get_type();
    	int t=(unsigned int)time(0);
    	do
    	{
    	
    		printf("debut\n");
    		n=rtable_.calc_next(k, parent, que);
    		wait_on_queue(type, k , n, 1);
    		printf("parcours \n");
    		cross_the_link(k, n);
    		int t_1 = (unsigned int)time(0);
    		t_k_n = (unsigned int)difftime(t_1, t);
    		ant_pkt.delete_memory(n);
    		ant_pkt.add_memory(n,t_k_n);
    		parent=k;
    		k = n;
    	}while (k != dest);
    
    	ant_pkt.affichage_du_memoire();
    	ant_pkt.become_backward_ant();
    	type = ant_pkt.get_type();
    	int initialtt = t_k_n ;
    	for(int i=ant_pkt.get_size_list()-2;i>=0;i--)
    	{
    		update_traffic(ant_pkt, i, initialtt);
    		update_table(ant_pkt,i);
    	}
    }
    Voilà mon code qui s'exécute séquentielle mais ce que je cherche une exécution parallèle. j'ai jamais utilisés les threads et j'ai besoin de quelque guide et du code simple pour implémenter ca. J'utilise visiual studio 2008 sous windows XP. Merci d'avance pour chaque information. Sil vous plait aidez moi.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    OpenMP: c'est pas ce que je préfère (TBB...), mais c'est simple et efficace.
    N'oublie pas de donner l'option de compilation correspondante à ton compilo (VC2005=/openmp)
    Les gains en vitesse sont là si chaque thread est suffisamment long (typiquement au moins 100 000 instructions)

    Faut écrire qqch du genre devant ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #pragma omp parallel for schedule(dynamic,1)
    for (int i= 1; i<=6 ; i++)
    PS: Je suis pas sûr de répondre à ta question. Je sais pas comment tu veux mélanger le multi-threading et le démarrage toutes les 5m,

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Une autre solution est d'utiliser des bibliothèques (Qt, SDL, ...) qui proposent des classes et/ou structures qui gèrent les threads, ou alors d'utiliser directement les fonctions systèmes (voir l'api windows)...

    Cela permet de bien contrôler le calcul parallèle...

    Et un petit conseil dans ton code: évite d'utiliser le même nom de variable pour plusieurs variables différentes et utilisées en même temps...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for (int i= 1; i<=6 ; i++)
    {
    	// [...] 
    	for(int i=ant_pkt.get_size_list()-2;i>=0;i--)
    	{
    		update_traffic(ant_pkt, i, initialtt);
    		update_table(ant_pkt,i);
    	}
    }
    Es-tu sûr que les "i" de la seconde boucle "for" ont les bonnes valeurs ?
    Quand tu as plusieurs boucles imbriquée, change les noms des indices : il y a 26 lettres dans l'alphabet!!!

  4. #4
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Pour l'avoir testé, je peux attester que boost::tread, une fois passé les premières difficultés du "tout raii" est vraiment simple et robuste.

    En plus, un thread n'étant rien qu'une instanciation de classe, on n'a pas de problèmes de "conflits de threads non terminés" (du moment qu'on fait appel à des mutexes pour la comunication extra-thread).

    Par contre, j'avoue ne jamais l'avoir testé sur windows, l'installation est peut-être plus compliquée dessus.



    bonne chance

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Par défaut
    merci pour votre aide. désolé pour la fautes des boucles intégrés j'ai pas fais attention . Pour la programmation parallèle je trouve que visual studio 2008 intègre openmp. Donc je choisi de travailer avec. Mais ce que je demande si vous savez si openmp implémente des threads simples ou non car déja quelques foncions de cette programmation parallèle sont des threads et merci d'avance

  6. #6
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Par défaut
    Après une bonne lecture du msdn je vois que les api windows sont performant. donc je vais utilisé les api windows pour l'implémentation des threads car la création n'est pas totalement parallèle. En faite pas le même principe.


    Maintenant j'ai implémenté mes threads avec leurs fonctions. Mais je dois gérer le partage de ressource.

    En faite la fonction a traiter par les threads contient des appels a des procedure d'autres classe. Il ya 2 procédure non pas de la même classe qui accède à la même ressource. Une pour consulter et une pour ecrie. Bien sur l'écriture est prioritaire.

    Est ce que c possible de d'implémenter cela et avec quel objet: mutex ou section critique? Pouvez vous m'aider svp c urgent.

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Citation Envoyé par manelisg Voir le message
    Est ce que c possible de d'implémenter cela et avec quel objet: mutex ou section critique?
    Oui, c'est possible... Une section critique étant le code entre mutex (lock / unlock) je dirais ... les deux !
    Regarde aussi les sémaphores... Car dans ton cas, on peut faire lire plusieurs thread en même temps, mais un seul doit écriture, sans aucun autre lise à se moment là... Regarde du coté des algorithmes qui utilisent des sémaphores/mutex tu trouveras pas mal de choses...


    Pouvez vous m'aider svp c urgent.
    Commentaire inutile... Tout est urgent, mon job le premier !

  8. #8
    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 : 50
    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
    Citation Envoyé par Fabllot Voir le message
    Oui, c'est possible... Une section critique étant le code entre mutex (lock / unlock) je dirais ... les deux !
    Dans le vocable spécifique à windows, une section critique est en fait une sorte de mutex avec un faible overhead, mais confiné au sein d'un seul processus.
    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.

  9. #9
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Par défaut
    Merci pour votre réponse c'est intéressant. Voila pour mon travail j'ai trouvé que les mutex sont suffisantes pour gérer les ressources de la fonction lire ma_table car deja cette fonction contient des ecritures dans des listes. Mais a part ca mes threads effectue un mise à jour dans ma_table. c'est à dire que chaque threads fais une lecture puis une ecriture dans ma table. et je ne sais pas que dois je utiliser pour gérer ca. il ya personne qui peut m'aider avec un grand merci
    voici mon 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
    36
    37
    38
    39
    DWORD antnet::forward_ant(ant_pkt *ant_pk)
    {
    	
    	do
    	{
    		printf("debut\n");
    		 dwWaitResult = WaitForSingleObject( 
                ghMutex,    // handle to mutex
                INFINITE);  // no time-out interval
     
            switch (dwWaitResult) 
            {
                // The thread got ownership of the mutex
                case WAIT_OBJECT_0: 
                    __try { 
                               ant_pk->ant_next = rtable_.calc_next(ant_pk->ant_k, ant_pk->ant_parent, que);
    						} 
    
                    __finally { 
                        // Release ownership of the mutex object
                        if (! ReleaseMutex(ghMutex)) 
                        { 
                            // Handle error.
                        } 
                    } 
                    break; 
            }
    		
    		
    	}while (ant_pk->ant_k != ant_pk->ant_dest);
    	for(int i=ant_pkt->get_size_list()-2;i>=0;i--)
    	{
    		
    						update_traffic(*ant_pkt, i, initialtt);
    						update_table(*ant_pkt,i);
    			
           
    	}
    les 2 bout de code en gras sont les concernés par la gestion d'accés à la ressource

Discussions similaires

  1. Gestion du port paralléle sous 2000
    Par kardex dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/01/2006, 19h47
  2. ecriture vers le port parallèle
    Par Luther13 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 19/03/2004, 22h46
  3. Execution d'une procédure en parallèle d'une autre
    Par Nouni dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/02/2004, 07h06
  4. Transaction et traitements parallèles
    Par jfphan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2004, 10h48
  5. Port Parallèle EPP ou ECP, hardware vs software ?
    Par TONIAPEL dans le forum Assembleur
    Réponses: 3
    Dernier message: 21/08/2003, 01h39

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