2016-05-16 4 views
1

Ich experimentiere mit Posix-Threads und kann einfach nicht das Problem herausfinden, mit dem ich gerade konfrontiert bin.pthread_join() funktioniert nicht

Blink1 und Blink2 werden in zwei Threads aufgerufen, Blink1 soll beendet werden und main muss dazukommen, danach soll Blink2 von main beendet werden.

Was passiert ist, dass Blink1 seine 5-Zeit-Schleife macht, aber Blink2 bleibt einfach unendlich, die 'printf ("verbunden \ n");' in main wird nie aufgerufen.

Was fehlt mir? Wieder zu blöd um das Handbuch zu lesen?

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

int i = 0; 

void *blink1(){ 
    int j; 
    for (j = 0; j < 5; j++){ 
     //activate 
     printf("blink1: i = %d ON\n", i); 
     sleep(1); 
     //deactivate 
     printf("blink1: i = %d OFF\n", i); 
     sleep(1); 
    } 
    pthread_exit(NULL); 
} 

void *blink2(){ 
    while (1){ 
     //activate 
     printf("blink2: i = %d ON\n", i); 
     sleep(1); 
     //deactivate 
     printf("blink2: i = %d OFF\n", i); 
     sleep(1); 
     i++; 
    } 
} 

int main(){ 
    pthread_t thrd1, thrd2; 

    //start threads 
    pthread_create(&thrd1, NULL, &blink1, NULL); 
    pthread_create(&thrd1, NULL, &blink2, NULL); 

    //output pid + tid 
    printf("PID: %d ; TID1: %lu ; TID2: %lu\n", getpid(), thrd1, thrd2); 

    //wait for thread 1 
    pthread_join(thrd1, NULL); 
    printf("joined\n"); 

    //terminte thread 2 
    pthread_kill(thrd2, 15); 

    return 0; 
} 
+4

Haben Sie bemerkt, dass 'thrd1' zweimal verwendet wird? Das bedeutet, dass es überschrieben wird, also schließen Sie sich Ihrem zweiten Thread an, der nie endet. –

Antwort

4

Du Wiederverwendung die Thread-Kennung thrd1 für die das zweite Gewinde erzeugt wird. Das heißt, Sie können nicht mit Thread 1 verbinden.

Sie warten effektiv auf den 2. Thread. Da der 2. Thread unendlich läuft, bekommt der Haupt-Thread keine Möglichkeit, die -Anweisung auszuführen.

+0

Ich entdeckte dies wegen einer Kompilierungswarnung. @Siraja, stelle sicher, dass du beim Kompilieren eine hohe Warnstufe verwendest. –

+0

wow, ich habe die man pages von create join gelesen und kill rauf und runter für eine halbe stunde und am ende ist es nur ein dummer copy-paste error .. vielen dank! – Carl

+1

@Siraja Sie haben auch ein anderes subtiles Problem. Es gibt ein * Data Race * (das ist undefined *) im Zugriff auf die Variable "i", da auf die beiden Threads mit beliebiger Synchronisation zugegriffen wird. Ich würde auch vorschlagen, Signalnummern (15) nicht hart zu codieren und stattdessen das entsprechende Makro von signal.h zu verwenden –

3

Tippfehler:

//start threads 
pthread_create(&thrd1, NULL, &blink1, NULL); 
pthread_create(&thrd1, NULL, &blink2, NULL); 

sollte wohl sein:

//start threads 
pthread_create(&thrd1, NULL, &blink1, NULL); 
pthread_create(&thrd2, NULL, &blink2, NULL); 
3

Weil Sie thrd1 zweimal verwenden, wenn Threads zu erstellen.

In der Tat wartet Ihre Verbindung auf den zweiten Thread.

Verwandte Themen