2013-04-05 30 views
1

當你創建一個線程時,它會自動啓動參數中的線程函數嗎?線程功能時序

我使用

iret1 = pthread_create(&client[i++].tID, NULL, thread_function, NULL); 
printf("Thread Created"); //for testing purposes 

在我的線程函數我在最高層print語句。例如:

void *thread_function(void *arg){ 
    printf("Entered thread function"); 
    ... 
    } 

,而不是打印Entered thread functionThread Created之後

而且它不會打印Entered thread function直到我開始另一個線程它打印的,有一個原因?

回答

1

您至少需要在每一個printf(3)格式功能的末尾添加一個換行符\n,並經常打電話給fflush(3),例如在您的兩個printf之後添加fflush(NULL);的呼叫...

不要忘記<stdio.h>功能被緩衝。請參閱setvbuf(3)函數和手冊頁。

爲什麼你的輸出沒有按照你想要的那樣打印就是因爲它停留在stdout的緩衝區中。

而你可能沒有保證輸出。個別角色也許可能混在一起。詳情請參閱unlocked_stdio(3)flockfile(3)

您可能需要閱讀(多次)一些pthread tutorial ...

PS,你可以考慮使用直接的write(2)系統調用(不使用任何<stdio.h>功能)。

+0

\ n是不打印的原因嗎?看看fflush頁面是否意味着線程函數會啓動,但我只是沒有看到「Entered ...」輸入?這是我真正想知道的 – emanyalpsid 2013-04-05 18:02:12

+0

所以線程函數正在運行,但它只是printf消息在stdout的緩衝區中?我只使用printf來測試線程函數是否啓動 – emanyalpsid 2013-04-05 18:07:37

+0

我不明白爲什麼你需要測試線程函數是否開始......如果'pthread_create'沒有失敗(它在成功時返回0 ,失敗時不爲零)。 – 2013-04-05 18:11:53