评论pthread_join会发生什么?

时间:2015-10-16 17:15:08

标签: c multithreading operating-system pthreads pthread-join

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

void *
mythread(void *arg) {
    printf("%s\n", (char *) arg);
    return NULL;
}

int
main(int argc, char *argv[])
{
    if (argc != 1) {
        fprintf(stderr, "usage: main\n");
        exit(1);
    }

    pthread_t p1, p2;
    printf("main: begin\n");
    Pthread_create(&p1, NULL, mythread, "A");
    Pthread_create(&p2, NULL, mythread, "B");
    // join waits for the threads to finish
    //Pthread_join(p1, NULL); 
    //Pthread_join(p2, NULL); 
    printf("main: end\n");
    return 0;
}

这是来自Remzi第27章的代码。到处玩,我很想知道为什么有时候跑步,我得到A打印两次。我知道为什么会这样,因为我没有包含join语句。为什么跳过连接导致这个?

我的输出:

shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
A
main: end
B
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
A
main: end
B
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
main: end
A
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out 
main: begin
main: end
B
A
A

1 个答案:

答案 0 :(得分:0)

取消呼叫pthread_join()不应导致&#34; A&#34;要打印两次。 (除非实施中存在错误。)

但由于您的fprintf()个调用共享相同的FILE *结构,因此它们可能不是多线程安全的。他们如何以及为什么要打印&#34; A&#34;两次取决于系统fprintf()功能的实施细节。