2009-09-04 6 views
6

Comment utilisez-vous la commande fork() de telle sorte que vous puissiez générer 10 processus et les faire effectuer une petite tâche simultanément.Multiple fork() Concurrency

Concurrent est le mot d'ordre, de nombreux endroits qui montrent comment utiliser fork n'utilisent qu'un seul appel à fork() dans leurs démos. Je pensais que vous utiliseriez une sorte de boucle for mais j'ai essayé et il semble dans mes tests que les fork() engendrent un nouveau processus, faisant du travail, puis engendrant un nouveau processus. Donc, ils semblent fonctionner de manière séquentielle, mais comment puis-je faire des bifurcations simultanées et que 10 processus fonctionnent simultanément si cela a du sens?

Merci.

Mise à jour: Merci pour les réponses les gars, je pense que j'ai juste mal compris certains aspects de fork() initialement, mais je le comprends maintenant. À votre santé.

+2

BTW---vous * vraiment * voulez des processus (comme dans votre texte) ou les fils (comme dans votre balise). Si les processus de l'étiquette que vous voulez est [multiprocessing] – dmckee

+0

oui vous avez raison –

Répondre

15

Appel fork() dans une boucle:

Ajout de code à attendre pour les enfants par des commentaires:

int numberOfChildren = 10; 
pid_t *childPids = NULL; 
pid_t p; 

/* Allocate array of child PIDs: error handling omitted for brevity */ 
childPids = malloc(numberOfChildren * sizeof(pid_t)); 

/* Start up children */ 
for (int ii = 0; ii < numberOfChildren; ++ii) { 
    if ((p = fork()) == 0) { 
     // Child process: do your work here 
     exit(0); 
    } 
    else { 
     childPids[ii] = p; 
    } 
} 

/* Wait for children to exit */ 
int stillWaiting; 
do { 
    stillWaiting = 0; 
    for (int ii = 0; ii < numberOfChildren; ++ii) { 
     if (childPids[ii] > 0) { 
      if (waitpid(childPids[ii], NULL, WNOHANG) != 0) { 
      /* Child is done */ 
      childPids[ii] = 0; 
      } 
      else { 
      /* Still waiting on this child */ 
      stillWaiting = 1; 
      } 
     } 
     /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */ 
     sleep(0); 
    } 
} while (stillWaiting); 

/* Cleanup */ 
free(childPids); 
+1

J'écrirais 'break -> exit' –

+2

oh très certainement. Vous invitez une bombe à fourche limitée sinon. –

+0

Merci d'avoir remarqué cela. J'ai mis à jour. –

3

Juste en boucle dans le processus "principal" engendrant un enfant après l'autre avec chacun attribuer une tâche particulière.

4

Lorsque vous démarrez des processus, le programme s'exécute simultanément. Mais notez que si vous n'avez pas assez de processeurs inactifs disponibles, ils pourraient ne pas être en cours d'exécution simultanément, ce qui ne devrait pas vraiment avoir d'importance ...

Votre second paragraphe donne l'impression que vous ne comprenez pas comment la fourche fonctionne, vous avez pour vérifier le code de retour pour voir si vous êtes dans le parent ou dans le processus fourchu. Donc, vous auriez le parent exécuter une boucle pour bifurquer 10 processus, et dans les enfants, vous faites ce que vous vouliez faire simultanément.