【问题标题】:What happens when pthread_join is commented?当 pthread_join 被注释时会发生什么?
【发布时间】:2016-01-15 12:50:48
【问题描述】:
#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

【问题讨论】:

  • 请修复代码中的编译器错误并移除对未提供的"mythreads.h" 标头的依赖。
  • 大写的函数名称是否涵盖了函数名称的所有小写版本的函数,除了它们进行某种错误处理并可能报告?就目前而言,只有非常熟悉"mythreads.h" 标题和书籍/课程材料的人才能提供可靠的帮助。我们可以做出(或多或少)有根据的猜测,但我们不喜欢不得不猜测。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您提供见解。但我不认为我清楚地遵循你的答案。你说它被打印两次是因为 printf() 的实现缺陷?
  • 是的。这是一个错误:sourceware.org/bugzilla/show_bug.cgi?id=14697 这个错误是由于 glibc 中的故意黑客行为,以避免由于其他线程持有锁而挂在 exit() 上,错误假设 exit()“应该”在此立即退出案子。标准中没有语言支持 glibc 正在做的事情。 另外:似乎这个错误也可能导致更严重的损坏,例如重复输出,即使没有任何明确的文件锁定。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2017-03-24
相关资源
最近更新 更多