2 votes

comment écrire pthread_create sur la même fonction ?

Quelqu'un pourrait-il m'aider ? J'ai les éléments suivants :

// 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 la partie_2 dans la partie_1 ( je veux dire sans appeler la fonction TreadMain() ).

merci pour vos réponses

6voto

bk1e Points 13737

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.

2voto

Rick Points 2477

Si tout ce que vous voulez faire est de déplacer la fonction de la partie 2 à l'intérieur de la partie 1, vous pouvez créer une classe locale à l'intérieur de la partie 1, avec une fonction statique fonction membre...

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

puis appeler LocalFunctor::ThreadFunc dans pthread_create

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

Si vous avez l'intention de faire cela plus d'une fois, regardez boost::thread ou enveloppez cela dans une classe d'aide de modèle.

-1voto

Zan Lynx Points 23100

Vous pouvez vous procurer un ordinateur Apple Macintosh avec OS 10.6 et commencer à programmer avec Grand Central Dispatch. Apple a ajouté quelques nouvelles fonctionnalités au compilateur C qui font presque exactement ce que vous semblez vouloir. Elles s'appellent Blocks.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X