2014-03-07 33 views
1
#include "apue.h"                
#include <limits.h> 
#include <pthread.h> 


void* fun(void *arg) 
{ 
    printf("%lu: I'm alive\n", pthread_self()); 
    pthread_exit(0); 
} 

int main(int argc, char **v) 
{ 
    pthread_t tid; 
    pthread_create(&tid, NULL, fun, NULL); 
    printf("%lu: I'm dead\n", pthread_self()); 

    return 0; 
} 


Pthread I/O缓冲区:为什么打印冗余行?

$ ./a.out 
3075692224: I'm dead 
3075689280: I'm alive 
3075689280: I'm alive 

$ ./a.out 
3076470464: I'm dead 

Somtimes,它打印一条线。 我觉得 一行:3076470464: I'm dead 或 两行:

3075692224: I'm dead 
3075689280: I'm alive 

应rigjt。 因为我不使用pthread_join,但为什么它可以打印三行;

+0

正确退出你的线程,你的输出应该没问题。目前代码产生未定义的行为。 – this

+0

有时候,解决问题比理解它发生的原因要容易得多。 –

回答

2

您可观察到未受保护的共享资源并发访问的奥秘,即在此情况下缓冲的stdout

使用互斥锁来保护stdout免遭并发访问,并且所有内容都将按预期工作:一个printf()语句将匹配一个打印行。

但是,你的程序存在风险,main()在线程结束之前退出,结束程序可能会在随机位置销毁线程。