我使用pthread
编写一个程序。奇怪的输出,当我使用pthread和printf
环境: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;
}
当我编译的源代码时,不存在警告或错误,但它的输出很奇怪。
它的一部分的输出
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
我想知道这种现象的原因。
在此输出中,Main : End Create Thread
未完全打印。在第3行,在"Thread Thread Thread Thread\n"
末尾的换行\n
消失。
大家的输出是这样吗?它不会每次都发生,但会在某个时候发生。
如果我使用互斥锁安全地调用printf
,奇怪的输出似乎停止。
POSIX说printf
是线程安全的,根据Cygwin.com,cygwin提供了posix风格的API。但是,有意想不到的输出。
是printf
真的线程安全吗?
我在Linux(Ubuntu)中执行了相同的程序100次,并且这个输出没有发生。
此外,我还没有理解为什么输出中的一些单词消失的原因。
您只看到两个线程输出交错。 – CCoder
线程安全并不意味着它是原子。 – Barmar
这个问题与确定的重复无关。这个任务具体是关于POSIX是否指定'printf()'在进程中的线程之间应该是原子的。所标识的重复是关于更一般的线程调度和竞争条件。 –