Différence entre pthread et fork sur gnu / Linux

Quelle est la différence fondamentale entre un pthread et une fourchette W. R. T. linux en termes de différences dans la mise en œuvre et la façon dont l'horaire Varie (Varie-t-il ?)

j'ai lancé strace sur deux programmes similaires, l'un utilisant pthreads et l'autre utilisant fork, les deux à la fin font que clone() syscall a des arguments différents, donc je devine les deux sont essentiellement les mêmes sur un système linux mais avec pthreads étant plus facile à traiter dans le code.

Can quelqu'un de donner une explication profonde?

EDIT : voir aussi un "liés à la 151970920" question

28
demandé sur Community 2011-04-01 18:02:43

3 réponses

Dans C il y a quelques différences cependant:

fork ()

  • le but est de créer un nouveau processus, qui devient le processus enfant de l'appelant

  • les deux processus exécuteront l'instruction suivante après l'appel de système fork ()

  • deux copies identiques de l'espace d'adresse de l'ordinateur, code, et la pile sont créés un pour le parent et l'enfant.

penser à la fourche comme à une personne; bifurquer provoque un clone de votre programme (processus), qui exécute le code qu'il a copié.


pthread_create ()

  • le But est de créer un nouveau thread dans le programme qui est donné le même processus de l'appelant

  • les fils dans le même processus peuvent communiquer en utilisant la mémoire partagée. (Attention!)

  • le second thread partagera des données,des fichiers ouverts, des gestionnaires de signal et des dispositions de signal, le répertoire de travail courant, les ID d'utilisateur et de groupe. Le nouveau thread aura sa propre pile, son identifiant de thread et ses registres.

continuer l'analogie; votre programme (processus) se développe une seconde bras lorsqu'il crée un nouveau fil, connecté à la même cerveau.

54
répondu Gabriel Fair 2012-02-20 03:59:13

vous devriez regarder la page de manuel clone .

en particulier, il Liste tous les modes de clones possibles et comment ils affectent le processus/thread, espace mémoire virtuel, etc...

vous dites" fils plus faciles à manipuler dans le code": c'est très discutable. Écrire du code multi-thread sans bogue, sans blocage, peut être tout un défi. Parfois le fait d'avoir deux processus distincts rend les choses beaucoup plus simple.

5
répondu Mat 2011-04-01 14:15:32

sous Linux, l'appel système clone clone une tâche, avec un niveau de partage configurable. fork() appels clone(least sharing) et pthread_create() appels clone(most sharing) . la fourche coûte un tout petit peu plus cher que pthread_createing à cause de la copie de tables et de la création de bouchons de vache pour la mémoire.

3
répondu Davood Hanifi 2012-10-26 05:29:03