Que faire si vous pouvez faire cela?
pthread_create()
doit créer une nouvelle pile pour le nouveau thread à utiliser. Si pthread_create()
copiait l'ancienne pile du thread existant dans un bloc de mémoire séparé pour créer une nouvelle pile, qu'adviendrait-il des variables locales qui pointent vers d'autres variables locales? Les variables locales sur la nouvelle pile pointeraient vers l'ancienne pile. Lorsque le thread utilisant l'ancienne pile (celle qui a appelé pthread_create()
) les renvoie ou les écrase, ces variables commencent à pointer vers des données non valides.
Mais qu'en est-il de fork()
? Pourquoi fork()
ne prend pas un pointeur de fonction comme pthread_create()
? Eh bien, contrairement à pthread_create()
, le nouveau thread d'exécution créé par fork()
n'a pas besoin de vivre dans le même espace d'adressage que l'ancien thread d'exécution, car ils sont dans des processus distincts. fork()
clone l'espace d'adressage virtuel du processus parent, la pile, le tas et tout. Les variables de pile du processus enfant ont les mêmes adresses virtuelles que les variables correspondantes dans le processus parent. Ainsi, tous les pointeurs du nouveau processus enfant continuent à être valides *, quel que soit le processus de l'ancien parent avec la mémoire.
* coin de Nitpicker: exclusion des pointeurs qui étaient invalides pour commencer, ainsi que la mémoire qui est délibérément partagée
merci pour votre réponse. J'ai déjà programmé pense avec pthreads et en plus fork() est supporté sur windows. qu'en est-il de déclarer une fonction dans un autre, est-ce possible? thanks – make
Certains compilateurs C ou C++ peuvent prendre en charge des fonctions imbriquées en tant qu'extension spécifique au compilateur. En C++, vous pouvez obtenir quelque chose de similaire en définissant une classe locale, mais il ne peut accéder à aucune variable de la portée de la fonction englobante (c'est-à-dire que ce n'est pas une fermeture). Les fonctions lambda en C++ 0x ressemblent-elles plus à ce que vous cherchez? – bk1e
Pouvez-vous s'il vous plaît me donner un lien? merci encore pour votre aide ... – make