2017-06-01 2 views
0

J'ai une situation comme suit:Est-il bon de commencer un processus enfant à partir d'un fil de processus principal

main() 
{ 
create a thread executing function thread_func(); 

another_func(); 

} 

another_func() 
{ 
    //check something and do something. 
    // To do something, create a child process. 
    // after creating child process, current thread goes in checking state again 
    // child process independently running. 
} 

thread_func() 
{ 
infinite loop(); // checking something and doing something 
} 
fil

est créé à l'aide pthread. Veuillez dire: est-il bon de lancer un processus fils comme ci-dessus dans un fil? Aussi ce qui se passe si cela est fait.

Est-ce que le processus enfant crée son propre thread de copie exécutant thread_func()?

Merci

+0

Vous pourriez être intéressé par la lecture de [Que deviennent les autres threads quand un thread forks()?] (Https://stackoverflow.com/questions/10080811/what-happens-to-other-threads-when-one- thread-forks) –

+0

Ce lien pourrait également être utile. https://stackoverflow.com/questions/39890363/what-happens-when-a-thread-forks –

Répondre

0

Cela dépend de ce que vous voulez faire ... ici votre fil ne sera jamais aller dans another_func() car il est coincé dans thread_func() à cause de la infinite_loop(). C'est donc votre programme principal qui va créer le processus enfant.

0

De votre question, ce que vous voulez faire n'est pas très clair. L'API pthread_create() prend un pointeur sur une fonction de type void * () (vide). L'exécution réelle du thread est sur ce thread, donc si vous voulez créer un processus enfant sur un thread, vous devez le faire à l'intérieur thread_func()

Si vous créez un autre processus avec l'API fork(), qui est la norme Ainsi, sur linux, cela créera un processus séparé avec une copie de tout l'espace mémoire du processus parent. Mais la mémoire sera virtuelle et marquée comme copie sur écriture, donc en réalité la mémoire ne sera pas copiée à moins que vous n'essayiez d'écrire dessus. Si après avoir appelé fork() vous appelez également exec() ou l'une des autres API de la famille exec(), vous n'avez plus besoin de vous préoccuper de la mémoire copiée. Après l'API exec(), le processus enfant aura son propre espace mémoire séparé du parent.