pthread_join()不起作用

时间:2016-05-16 14:40:21

标签: c pthreads

我正在尝试使用posix线程,但我无法弄清楚我现在面临的问题。

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;
}

3 个答案:

答案 0 :(得分:4)

您正在重用线程标识符thrd1来创建第二个线程。这意味着你不能加入与线程1。

您正在等待第二个帖子。因为,第二个线程无限运行,主线程将无法执行pthread_kill()语句。

答案 1 :(得分: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);

答案 2 :(得分:3)

因为在创建线程时使用thrd1两次。

事实上,你的联接正在等待第二个线程。