2015-10-16 66 views
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章玩耍,我很想知道为什么有时在运行时,我会打印两次。我知道为什么会发生这种情况,因为我没有包含联合声明。为什么要跳过连接造成这种情况?当pthread_join被注释时会发生什么?

我的输出:

[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
A 
main: end 
B 
[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
A 
main: end 
B 
[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
main: end 
A 
[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
main: end 
B 
A 
A 
+1

请修正您的代码中的编译器错误,并删除对非提供的“mythreads.h”头的依赖。 – o11c

+1

大写的函数名称是否覆盖函数名称的所有小写版本的函数,除非它们执行某种错误处理并可能报告?就目前而言,只有熟悉“mythreads.h”标题和图书/课程资料的人才能够提供帮助。我们可以做出(或多或少)受过教育的猜测,但我们不喜欢猜测。 –

+0

可能重复[pthread:一个printf语句在子线程中打印两次](http://stackoverflow.com/questions/13550662/pthread-one-printf-statement-get-printed-twice-in-child-thread) –

回答

0

删除通话pthread_join()应该不会造成 “A” 被打印两次。 (禁止执行中的错误)

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

+0

感谢您加入见解。但我不认为我明确地遵循你的答案。你说它由于printf()的实现缺陷而被打印了两次? – FlyingAura

+0

是的。这是一个错误:https://sourceware.org/bugzilla/show_bug.cgi?id=14697 *这个错误是由于故意haibery在glibc中,以避免挂在退出()由于锁被其他线程,在错误假设exit()“应该”在这种情况下立即退出。标准中没有任何语言支持glibc正在做的事情。*另外:*看起来这个bug也会导致更严重的损坏,例如重复输出,即使没有任何明确的文件锁定。 –

相关问题