2010-12-06 102 views
4

Im en utilisant Ubuntu 10.10, Code :: Blocs avec GCC 4.2.principal ne continue pas après pthread

J'ai écrit un code comme ça:

#include <iostream> 
#include <stdlib.h> 
#include <pthread.h> 

using namespace std; 

void *thread1proc(void* param){ 
    while(true) 
    cout << "1"; 

    return 0; 
} 

int main(){ 
    pthread_t thread1; 

    pthread_create(&thread1,NULL,thread1proc,NULL); 
    pthread_join(thread1,NULL); 

    cout << "hello"; 
} 

commence Main, crée le fil. Mais ce qui est bizarre (pour moi) c'est que Main ne continue pas à courir. Je m'attends à voir un message "bonjour" à l'écran et la fin du programme. Parce que dans Windows, en Delphi cela a fonctionné pour moi comme ça. Si "main" est aussi un thread, pourquoi ne continue-t-il pas à fonctionner? S'agit-il de l'enfilage POSIX?

Merci.

+0

Pour la portabilité, créez explicitement les discussions dans un état avec 'pthread_attr_setdetachstate jumelables (& attr, PTHREAD_CREATE_JOINABLE)' –

Répondre

3

Il s'arrête car vous appelez pthread_join et le thread que vous rejoignez "à" a une boucle infinie.

A partir de ce lien:

Le pthread_join() suspend la fonction exécution du thread appelant jusqu'à ce que le fil cible se termine, à moins que le fil cible a déjà terminé.

+0

@Tolga: Vous pouvez tirer autant de fils que vous le souhaitez. Dans votre cas spécifique, vous devrez les déclencher avant l'appel de pthread_join, car votre thread se bloque dans une boucle infinie. Vous devez étudier le fonctionnement de la bibliothèque pthread ... Voir ici: https://computing.llnl.gov/tutorials/pthreads/ –

+0

@Tolga: les threads pthreads et windows fonctionnent de façon assez similaire. Windows n'a pas, cependant, un équivalent à la fonction de jointure ... – Goz

+0

N'y a-t-il aucune fonction comme "resumeThread" comme dans les API Windows? Je ne veux pas attendre la fin du fil. – tcak

7

pthread_join bloquera jusqu'à ce que thread1 finalise (appel pthread_exit ou retour), qui (comme il a une boucle infinie), il ne sera jamais le faire.