2016-04-07 14 views
1

Ich habe ein kleines Programm in C mit Windriver zu schreiben, die drei Threads erstellt:Sleep() beendet Faden in Windriver

  • Thread # 1: erzeugt eine Zufallszahl
  • Thread # 2: kill # 3, wenn die Zufallszahl kleiner 25
  • Thread # 3: kill # 2, wenn die Zufallszahl größer 25

einen Thread zu töten, ich möchte sicherstellen, warten sie erstellt wird, so Ich habe festgestellt, dass ich sleep() verwenden kann, um einen anderen Thread übernehmen zu lassen und sich selbst erstellen zu lassen. Aber alle sterben mit dem Schlaf.

kam ich mit diesem Code auf:

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h>  

#define NUM_THREAD 3 

int theRandomNumber = 0; 

void *RandomNumber (void *threadid){ 
    int id = (int) threadid; 
    //srand(); 
    theRandomNumber = rand() % 50; 
    printf("Thread %d: Random: %d \n", id, theRandomNumber); 
    pthread_exit(NULL); 
    return 0; 
} 

void *CheckNumber (void *threadid){ 
    int id = (int) threadid; 
    printf("Thread #%d is active and going to sleep now\n", id); 
    sleep(1000); 
    //here he dies without annoucing anything or something 
    printf("Thread #%d is active again and back from sleep\n", id); 
    if (id == 1){ 
     if (theRandomNumber >= 25){ 
      pthread_cancel(2); 
      printf("THREAD %d: Thread #2 is closed \n", id); 
     } 
    } 
    else{ 
     if (theRandomNumber < 25){ 
      pthread_cancel(1); 
      printf("THREAD %d: Thread #1 is closed \n", id); 
     } 
    } 
    return 0; 
} 


int main (int argc, char *argv[]){ 
    pthread_t threads[NUM_THREAD]; 
    int t = 0; 

    printf("in main: create thread #%d \n", t); 
    pthread_create (&threads[t], NULL, RandomNumber, (void *) t++); 

    printf("in main: create thread #%d \n", t); 
    pthread_create (&threads[t], NULL, CheckNumber, (void *) t++); 

    printf("in main: create thread #%d \n", t); 
    pthread_create (&threads[t], NULL, CheckNumber, (void *) t++); 
} 

Der Teil mit den Randomnumber funktioniert gut, ich habe es hier links, aber ich kann es auf Anfrage senden.

Nachdem ein Thread die sleep() erreicht, wird es beendet.

Console Log:

in Haupt: create Gewinde # 0
in Haupt: Gewinde # 1
in Haupt erstellen: create Thread # 2
Thread # 0: Random: 8
Thread # 1 aktiv und jetzt
Thread # 2 ist aktiv und jetzt

Nichts passiert nach dem Schlaf schlafen gehen schlafen gehen. Irgendwelche Ideen?

+0

Dies ist hier nicht der Punkt ist, aber wenn Sie nicht verarbeiten Programmargumente zu tun, verwenden Sie die 'main' Prototyp ohne Argumente, auch bekannt als' int main() ' – jdarthenay

+4

Es wäre Ihr Hauptprogramm erscheinen – CarlH

+0

endet habe ich versucht, Ihre Kompilieren Code, es gibt Fehler. Könnten Sie bitte einen Code bereitstellen, den Sie kompilieren können? – jdarthenay

Antwort

1

Verlassen Sie main() durch Aufruf pthread_exit(), um nur den "Haupt" -Thread zu beenden, sonst beendet main() den Prozess und damit alle seine verbleibenden Threads.

Alternativ können Sie main() verbinden alle Threads per Aufruf pthread_join() auf jeder PThread-ID von den Aufrufen an pthread_create() zurückgegeben.

+0

Sie haben Recht - wenn das 'main' endet, werden auch die anderen Threads beendet. Behebt dies mit dem 'pthread_join()' - jetzt ist mein 'pthread_cancel()' hängen geblieben, aber das ist ein anderes Problem. Vielen Dank! – Skandix