Et si vous pourrait faire ça ?
pthread_create()
doit créer une nouvelle pile pour que le nouveau fil puisse l'utiliser. Si pthread_create()
copié l'ancienne pile du thread existant dans un bloc de mémoire séparé pour créer une nouvelle pile, que se passerait-il alors pour les variables locales qui pointent vers d'autres variables locales ? Les variables locales de la nouvelle pile pointeraient vers l'ancienne pile. Lorsque le thread utilisant l'ancienne pile (celui qui a appelé pthread_create()
) les renvoie ou les écrase, ces variables commencent à pointer vers des données invalides.
Mais qu'en est-il fork()
? Pourquoi ne pas fork()
prendre un pointeur de fonction comme pthread_create()
? Eh bien, contrairement à pthread_create()
le nouveau fil d'exécution créé par fork()
n'a pas besoin de vivre dans le même espace d'adressage que l'ancien fil d'exécution, car ils sont dans des processus distincts. fork()
clone l'espace d'adressage virtuel du processus parent, pile, tas, et tout. Les variables de la pile du processus enfant ont les mêmes adresses virtuelles que les variables correspondantes du processus parent. Ainsi, tous les pointeurs dans le nouveau processus enfant continuent d'être valides*, peu importe ce que l'ancien processus parent fait avec la mémoire.
* Le coin des mauvaises langues : exclure les pointeurs qui n'étaient pas valides au départ, ainsi que la mémoire qui est délibérément partagée.