我使用pthread和printf时的奇怪输出

Tak*_*ima 5 c printf pthreads

我用一个程序写pthread.

环境:windows 7,CYGWIN_NT-6.1 i686 Cygwin,gcc(GCC)4.5.3

源代码

#include<stdio.h>
#include<pthread.h>

void *th_func(void *p)
{
    int iLoop = 0;

    for(iLoop = 0;iLoop<100;iLoop++)
    {
        printf("Thread Thread Thread Thread\n");
    }

    return;
}

int main()
{
    int iLoop = 0;
    pthread_t QueThread;

    printf("Main : Start Main\n");

    printf("Main : Start Create Thread\n");
    pthread_create(&QueThread,NULL,th_func,NULL);
    printf("Main : End Create Thread\n");

    for(iLoop = 0;iLoop<100;iLoop++)
    {
        printf("Main Main Main Main\n");
    }

    pthread_join(QueThread,NULL);

    printf("Main : End Main\n");

    printf("---------------\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译源代码时,没有警告或错误,但它的输出很奇怪.

它的一部分输出

Main : Start Main
Main : Start Create Thread
Thread Thread Thread ThreThread Thread Thread Thread
Main Main Main Main
Thread Thread Thread Thread
Main Main Main Main
Run Code Online (Sandbox Code Playgroud)

我想知道这种现象的原因.

在此输出中,Main : End Create Thread不完全打印.在第3行,结尾\n处的换行"Thread Thread Thread Thread\n"消失了.

每个人的输出都是这样的吗?它不会每次都发生,但有时会发生.

如果我使用互斥锁printf安全地调用,奇怪的输出似乎停止了.

POSIX说printf是线程安全的,根据Cygwin.com,cygwin提供了posix风格的API.但是,有意想不到的输出.

printf真的是线程安全的吗?

我在Linux(Ubuntu)中执行了相同的程序100次,并且没有出现此输出.

另外,我还没有理解为什么输出上的某些词语消失了.

Mic*_*urr 4

这看起来可能是 Cygwin 中的一个错误,或者可能是某些配置错误。这里的几个答案表明“线程安全”仅承诺该函数不会对程序造成损害,线程安全并不一定意味着函数是“原子的”。但是,据我所知,POSIX 并没有正式定义“线程安全”(如果有人有这样的定义,请在评论中发布)。

然而,POSIX 不仅指定printf()线程安全,还指定

所有引用 ( FILE * ) 对象的函数的行为都应类似于在内部使用 follockfile() 和 funlockfile() 来获取这些 ( FILE *) 对象的所有权。

由于printf()隐式引用该stdout FILE*对象,因此所有printf()调用相对于彼此(以及使用任何其他函数)都应该是原子的stdout)都应该是原子的。

请注意,这在其他系统上可能并非如此,但根据我的经验,它确实适用于许多多线程系统。