2010-02-13 4 views
2

Quelqu'un pourrait-il m'aider? Je donne les résultats suivants:comment écrire pthread_create sur la même fonction?

// part_1 
if (pthread_create(&threadID, NULL, ThreadMain, 
    (void *) clientSocket) != 0) { 
    cerr << "Unable to create thread" << endl; 
    exit(1); 
} 

// part_2 
void *ThreadMain(void *clientSocket) { 

    pthread_detach(pthread_self()); 

    ... 

    delete (TCPSocket *) clientSocket; 
    return NULL; 
} 

Je voudrais avoir part_2 dans Part_1 (je veux dire sans faire appel à la fonction TreadMain())

merci pour vos réponses

Répondre

2

Si tout ce que vous voulez faire est de déplacer simplement la fonction pour part2 l'intérieur part1, vous pouvez créer local classe à l'intérieur de part1, avec une fonction membre statique ...

class LocalFunctor 
{ 
public: 
    static void *ThreadFunc(void* clientSocket) 
    { 
     pthread_detach(pthread_self()); 
     ... 
     delete (TCPSocket *) clientSocket;  
     return NULL; 
    } 
}; 

puis appelez LocalFunctor :: ThreadFunc au sein pthread_create

pthread_create(&threadID, NULL, LocalFunctor::THreadFunc,(void *) clientSocket) 

Si vous allez le faire plus d'une fois, regardez boost :: thread ou enveloppez-le dans une classe d'aide template.

-Rick

5

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

+0

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

+0

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

+0

Pouvez-vous s'il vous plaît me donner un lien? merci encore pour votre aide ... – make

-1

Vous pouvez obtenir un ordinateur Apple Macintosh avec OS 10.6 et commencer la programmation avec Grand Central Dispatch. Apple a ajouté quelques nouvelles fonctionnalités du compilateur C qui font presque exactement ce que vous voulez. Ils s'appellent des blocs.

+0

Ou pas .......... –

Questions connexes