2010-04-27 9 views
1

Duplicate possible:
c++ multithreadC++ multithread

J'utilise C++ pour implémenter une classe de fil. Le code est le suivant. J'initialise deux objets, souhaite qu'il démarre deux threads (j'utilise pthread_self() pour regarder l'Id de thread). Mais le résultat montre qu'il n'y a qu'un seul thread à côté du thread principal. Je suis un peu confus ...

class Thread { 
public: 
    int mask; 
    pthread_t thread; 

    Thread(int); 
    void start(); 
    static void * EntryPoint (void *); 
    void Run(); 
}; 

Thread::Thread(int a) { 
    mask =a; 
} 

void Thread::Run() { 

    cout<<"thread begin to run" <<endl; 
    cout <<" Thread Id is: "<< pthread_self() << endl; // the same thread Id.  
} 

void * Thread::EntryPoint(void * pthis) { 
    cout << "entry" <<endl; 
    Thread *pt = (Thread *) pthis; 
    pt->Run(); 
} 

void Thread::start() { 

    pthread_create(&thread, NULL, EntryPoint, (void *)ThreadId); 
    pthread_join(thread, NULL); 
} 

int main() { 
    int input_array[8]={3,1,2,5,6,8,7,4}; 
    Thread t1(1); 
    Thread t2(2); 
    t1.start(); 
    t2.start() 
} 

Répondre

4

vous voyez ce comportement parce que vous joindre à chacun de vos fils immédiatement après les spawn. Lorsque vous joignez un thread, vous bloquez jusqu'à ce que le thread se termine.

0

Vous générez deux threads, mais le premier thread est joint (et détruit) avant que le deuxième thread ne soit généré, de sorte que vous disposez effectivement d'un seul thread exécuté à la fois. La façon de résoudre ce problème est la suivante:

  1. Créez une fonction de jointure distincte qui appelle join().
  2. N'appelez pas rejoindre directement à partir de votre fonction start().
  3. Dans votre fonction join(), veillez à marquer le thread comme ayant été joint/détruit.
  4. Dans votre destructeur, si votre thread n'a pas été joint, vous devez le détacher.

Je dois également souligner que boost::thread fournit un multithread multiplateforme pour C++.