2012-11-11 46 views
1

可能重复:
Understanding pthread_detach创建1个线程,其输出“新线程”任意次数

以下代码是创建一个单独的线程它打印“新线程”。

#include<stdio.h> 
#include<pthread.h> 
void *thr_fn(void *arg) 
{ 
     printf("New thread\n"); 
     sleep(5); 
     return (void *)1; 
} 
int main() 
{ 
     pthread_t pid; 
     void *t; 
     pthread_create(&pid,NULL,thr_fn,NULL); 
     printf("main thread\n"); 
     exit(0); 
} 

输出可以是任何这些:

1.main thread 
     New thread 
    2.main thread 
    3.main thread 
     New thread 
     New thread

第一和第二是有说服力的。但任何人都可以解释第三个可选输出背后的原因。

+0

http://stackoverflow.com/questions/13319793/understanding-pthread-detach - 类似的问题昨天问 – Mat

+0

首先,输出可能是其他任何数量的东西,因为'printf'不同步。其次,你的程序没有定义行为,因为你永远不会加入该线程。 –

+0

@Kerrek SB:加入线程删除这个程序中的竞争条件。它如何说明打印2“新线程”的原因。 – user1815906

回答

0

我敢肯定,你的程序不创建两个线程;-)

最有可能你看到的竞争条件上stdout新的线程和主线程之间的影响。 exit冲洗并关闭所有流。这可能以非原子方式发生,并且与其他线程并行写入同一个流缓冲区,并冲洗到文件描述符。

+0

我知道竞赛条件,但我仍然无法理解为什么有2个“新线程”。由于两个线程都具有相同的文件描述符,所以不要打印1个“主线程”或1个“新线程”。请你用一些例子来解释一下。 – user1815906

+0

@ user1815906:这不是重要的文件描述符。文件描述符只是内核给程序的ID。但'printf'和所有使用'FILE *'的东西都不能直接在文件句柄上运行。相反,他们正在处理由应用程序管理的一些缓冲区。如果两个线程在同一个缓冲区上工作(一个是通过在'exit'内执行'fflush'来执行'printf'),那么所有的投注都是打开的。 –