2016-05-16 52 views
1

我正在試驗posix線程,只是無法弄清楚我現在面臨的問題。pthread_join()不工作

Blink1和Blink2在兩個線程中被調用,Blink1應該退出並且主要加入它,之後Blink2應該被main終止。

會發生什麼是Blink1做5次循環,但Blink2只是保持無限,'printf(「加入\ n」);'在主要從未被調用。

我錯過了什麼?又一次太傻看了手冊?

#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

您是否注意到'thrd1'使用了兩次?這意味着它被覆蓋,所以你實際上加入了你的第二個線程,永遠不會結束。 –

回答

4

重用創建的第二個線程的線程標識符thrd1。這意味着你不能加入與線程1.

您正在等待第二個線程。由於第二個線程無限運行,主線程將不會有機會執行pthread_kill()語句。

+0

我發現這是因爲編譯警告。 @Siraja,確保在編譯時使用高警告級別。 –

+0

哇,我一直在閱讀創建加入的人的頁面,並殺了半個小時,最後它只是一個愚蠢的複製粘貼錯誤..非常感謝! – Carl

+1

@Siraja另外,你還有一個微妙的問題。在訪問變量'i'時有一個* data race *(它是* undefined *),因爲它是由兩個線程通過任何同步訪問的。我還建議不要硬編碼信號編號(15),而是使用signal.h中的相應宏 –

3

錯字:

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

大概應該是:

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

因爲在創建線程時使用thrd1兩次。

實際上,您的連接正在等待第二個線程。