2011-06-21 2 views
0

J'ai une liste de pointeurs de classe. J'ai une fonction qui appelle une méthode à partir de ces pointeurs. Chaque pointeur de la liste est une classe dérivée d'une classe principale. Ce que je suis en train de faire, c'est parcourir la liste et appeler la méthode du 1er pointeur dans la liste, attendre qu'elle se termine, puis aller au pointeur d'objet de 2ème classe et appeler la méthode et ainsi de suite.Utilisation de la fourche pour l'exécution de plusieurs commandes

Maintenant, j'ai comme 20 classes dérivées et il prend une éternité à compléter à travers la liste. Je voulais donc utiliser une fourchette pour exécuter peut-être 4-5 méthodes de classe à la fois pour que tout le processus est beaucoup plus rapide que ..

list<Myclass *> check; 

myfunc(list<Myclass *> check) 
{ 
    for(list<Myclass*>::iterator a= check.begin();a!=check.end();a++) 
      (*a)->run(); 
} 

c'est un peu un squelette de ce que je ... ce que je veux est comme chaque fois qu'il va bifurquer et créer un processus fils pour exécuter la commande et passer à la suivante ...

+1

Y at-il une question là-dedans quelque part? – tenfour

Répondre

1

Oui, vous pouvez utiliser fork() pour travailler dans un thread enfant. Cependant, une fois que le processus enfant a terminé son travail, il revient et vous ne partagez pas les données entre eux. Je ne suis pas clair sur votre implémentation, mais si l'intention est d'engendrer certains processus pour faire du travail supplémentaire, alors cela semble correct, mais vous voulez probablement un thread, pas une fourchette.

0

Vous êtes plus susceptible de vouloir démarrer un thread que d'enfiler un processus. C'est plus facile quand il y a des pointeurs impliqués, puisque les pointeurs peuvent être partagés à l'intérieur d'un processus mais pas à l'extérieur.

De même, forger un processus a un certain temps de fonctionnement.

0

Vous ne transmettez cependant aucune mémoire avec une fourche. Vous voulez probablement un fil. Voici comment faire si:

int i = 0; 
int n = 4; //or 5; 

list<Myclass> check; // You can't use pointers here though, as the memory is not shared. 

myfunc(list<Myclass> check) 
{ 
    for(list<Myclass>::iterator a= check.begin();a!=check.end();a++) { 
      if(i >= n) { 
       wait(); 
      } else { 
       if(fork() == 0) { 
        a->run(); 
        exit(0); 
       } else { 
        i++; 
       } 
      } 
    } 

    // Prevent a voodoo priest from making zombies of these processes. 
    while(i-->0) wait(); 
} 
+0

Alors, comment utiliser un thread? –

+0

Dépend de votre système d'exploitation, ou vous pouvez regarder boost :: thread http://www.boost.org/doc/libs/1_46_1/doc/html/thread.html –

+0

J'utilise linux ... –

0

Je voulais donc utiliser une fourchette pour exécuter peut-être 4-5 méthodes de classe à la fois pour que tout le processus est beaucoup plus rapide que ..

Comme beaucoup d'autres ont déjà mentionné, vous voulez probablement utiliser des discussions plutôt que des fourches ici. Il y a beaucoup plus de frais généraux avec une fourchette que de lancer un nouveau fil.

Ce que d'autres n'ont pas dit, c'est que le fait de générer un fil ou un processus ne garantit pas une accélération. Par exemple, vous risquez d'obtenir un ralentissement plutôt qu'une accélération si vous générez plusieurs threads liés au processeur en même temps que le nombre de processeurs disponibles. Qu'est-ce qui se passe, c'est que chacun de ces threads en concurrence avec les autres pour leur tour sur le nombre limité de processeurs. Un thread va tourner un peu de temps et ensuite être remplacé par un autre.

Il est recommandé de réduire le nombre de threads actifs par rapport au nombre de processeurs disponibles. Même si vous faites cela, vous pouvez toujours avoir des problèmes quand une autre application liée au processeur arrive à fonctionner en même temps.

Questions connexes