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

时间:2014-03-07 02:52:27

标签: c pthreads buffer

#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;
}


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

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

有时,它会打印一条线。 我认为 一行:3076470464: I'm dead 要么 两行:

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

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

1 个答案:

答案 0 :(得分:2)

您观察到对共享资源的无保护并发访问的奥秘,在这种情况下是缓冲的stdout

使用互斥锁保护stdout免受并发访问,并且一切都将按预期工作:一个printf()语句将匹配一条打印的行。

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