CreateThread vs fork ()

Avons-nous une sorte de relation entre fork () et CreateThread? Y a-t-il quelque chose que CreateThread appelle en interne fork ()?

Dans NT, l’unité de travail fondamentale est appelée un thread (c’est-à-dire que NT planifie les threads, pas les processus). Les threads utilisateur s’exécutent dans le contexte d’un processus. Lorsque vous appelez CreateThread, vous demandez au kernel NT d’allouer une unité de travail dans le contexte de votre processus (vous pouvez également planifier vous-même des fibres, mais cela dépasse le sujet de votre question).

Lorsque vous appelez CreateThread, vous fournissez à la fonction un point d’entrée qui sera exécuté après l’appel de la fonction. Le code doit être dans l’espace virtuel du processus et la page doit avoir des droits d’exécution. En d’autres termes, vous donnez un pointeur de fonction. 😉

fork () est une fonction UNIX qui demande au kernel de créer une copie du processus en cours d’exécution. Le processus parent obtient le pid du processus enfant et le processus enfant obtient 0 (de cette façon, vous savez qui vous êtes).

Si vous souhaitez créer un processus sous Windows, vous appelez la fonction CreateProcess, mais cela ne se comporte pas comme fork (). La raison en est que la plupart du temps, vous créerez des threads, pas des processus.

Comme vous pouvez le voir, il n’y a pas de relation entre CreateThread et fork.

fork () n’existe que sur les systèmes Unix et crée un nouveau processus avec le même état que l’appelant. CreateThread () crée un nouveau thread dans le même processus.

CreateThread – est pour les threads, fork – sert à créer un processus en double. Et il n’y a pas de manière native d’avoir une fonctionnalité de fourche pour Windows (au moins via Win32).

Le modèle de processus Windows et Unix est fondamentalement très différent. Il est donc impossible de mapper directement l’API de l’un sur l’autre.

fork () clone le processus en cours en deux. Dans le processus parent, fork () renvoie le pid, et dans le fils il retourne 0. Ceci est généralement utilisé comme ceci:

 int pid; if (pid = fork()) { // this code is executed in the parent } else { // this code is executed in the child } 

Cygwin est une couche d’émulation pour créer et exécuter des applications Unix sous Windows, qui émule le comportement de fork () à l’aide de CreateProcess ().

Vous voudrez peut-être savoir si Microsoft fournit fork () dans les versions haut de gamme de Windows avec un composant appelé Subsystem for UNIX-based Applications (SUA). Vous pouvez trouver des détails dans ma réponse ici .

J’ai trouvé ce lien qui, à mon avis, pourrait être utile pour clarifier quelques faits concernant le forking / threading. Partage ici: http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/