我用一个程序写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次,并且没有出现此输出.
另外,我还没有理解为什么输出上的某些词语消失了.
这看起来可能是 Cygwin 中的一个错误,或者可能是某些配置错误。这里的几个答案表明“线程安全”仅承诺该函数不会对程序造成损害,线程安全并不一定意味着函数是“原子的”。但是,据我所知,POSIX 并没有正式定义“线程安全”(如果有人有这样的定义,请在评论中发布)。
然而,POSIX 不仅指定printf()线程安全,还指定:
所有引用 ( FILE * ) 对象的函数的行为都应类似于在内部使用 follockfile() 和 funlockfile() 来获取这些 ( FILE *) 对象的所有权。
由于printf()隐式引用该stdout FILE*对象,因此所有printf()调用相对于彼此(以及使用任何其他函数)都应该是原子的stdout)都应该是原子的。
请注意,这在其他系统上可能并非如此,但根据我的经验,它确实适用于许多多线程系统。