2017-05-05 95 views
0

我遇到了奇怪的行爲pthread_create函數。代碼如下:創建線程很慢

#include <stdlib.h> 
#include <stdio.h> 
#include <pthread.h> 

void *foo(void* a) { 
    printf("Doing something"); 
    pthread_exit(NULL); 
} 

int main() { 
    printf("Main created"); 
    pthread_t thread; 
    pthread_create(&thread, NULL, foo, NULL); 

    while(1); // This causes trouble 

    pthread_join(thread, NULL); 

    return 0; 
} 

出於某種原因,在地方while,從跟帖留言很長的延遲後顯示。我希望在pthread_create之後調用新線程是完全獨立於main的,因此不應該被它的代碼所影響。

+2

您是否嘗試刷新'stdout'? –

+0

@BenSteffan謝謝你的評論,在這個例子中它是由輸出緩衝引起的。 – Lorin

+0

對'printf()'的調用正在寫入'stdout'流緩衝區。要通過該緩衝區並顯示在終端上,必須發生以下三件事之一。 1)緩衝區溢出(不太可能)2)程序結束3)格式字符串或數據以'\ n'結尾(未完成)因此在程序結束之前不會輸出任何內容。 'while(1);'循環永遠不會退出,所以程序永遠不會結束。還要注意:'main()'會吸收所有循環的CPU週期,所以沒有任何東西可以讓創建的線程運行。建議:使用'\ n'結束每個'printf()'格式字符串並移除'while()'語句 – user3629249

回答

3

這與線程無關。

你會發現有發生相同的行爲:

printf("Doing something"); 
while(1) ; 

這是因爲你沒有包含在你打印的字符串,這將導致線路被緩衝的結尾換行。由於沒有進一步的輸出產生,該線可能會被緩衝很長時間(甚至可能永遠)。

爲了避免這種情況,您可以:

  • 添加新行所有的輸出線,例如中printf("Doing something\n");

  • 呼叫fflush(stdout)printf()之後促使行被刷新

  • 呼叫setvbuf(stdout, NULL, _IONBF, 0)事先禁用所有的輸出緩衝

+1

我會在while(1);'while'(1){usleep(10);}'時改變''。沒有理由對待這樣的CPU :) – RoiHatam

+0

@RoiHatam這不應該是一個實際的例子。 – duskwuff

+0

@duskwuff,你說得對,在這個特殊的例子中,它是由輸出緩衝引起的。然而,在實際代碼中,這個例子往往非常相似(主要產生一個線程並跳轉到一個while循環),我在輸出中使用了換行符。雖然我不知道爲什麼,但在while循環中添加一個簡短的usleep實際上有所幫助。 – Lorin