当pthread_join被注释时会发生什么?

3
#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语句导致的。为什么跳过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
请修复您代码中的编译器错误,并移除对未提供的“mythreads.h”头文件的依赖。 - o11c
1
大写的函数名称是否是所有小写版本函数的覆盖函数,除了它们执行某种错误处理和报告外?目前只有非常熟悉“mythreads.h”头文件和相关教材的人才能够提供可靠的帮助。我们可以进行(更或者更少)有根据的猜测,但我们不喜欢猜测。 - Jonathan Leffler
1个回答

0

删除调用pthread_join()不应导致“A”被打印两次。(除非实现中存在错误。)

但由于您的fprintf()调用共享相同的FILE *结构,它们可能不是多线程安全的。它们如何以及为什么会打印两次“ A”取决于您系统的fprintf()函数的实现细节。


谢谢您的见解。但我认为我没有清楚地理解您的答案。您是说由于printf()的实现缺陷,它被打印了两次? - FlyingAura
是的。这是一个错误:https://sourceware.org/bugzilla/show_bug.cgi?id=14697 这个错误是由于glibc中的有意破坏造成的,以避免由其他线程持有锁引起的exit()挂起,在错误的假设下,exit()“应该”立即退出。没有标准支持glibc正在做的事情。 另外:似乎这个错误也可能导致更严重的损坏,如重复输出,即使没有任何显式文件锁定。 - Andrew Henle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接