2012-11-11 73 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'),那麼所有的投注都是打開的。 –