2015-10-16 56 views
3
#include <stdio.h> 
#include "mythreads.h" 
#include <stdlib.h> 
#include <pthread.h> 

void * 
mythread(void *arg) { 
    printf("%s\n", (char *) arg); 
    return NULL; 
} 

int 
main(int argc, char *argv[]) 
{ 
    if (argc != 1) { 
     fprintf(stderr, "usage: main\n"); 
     exit(1); 
    } 

    pthread_t p1, p2; 
    printf("main: begin\n"); 
    Pthread_create(&p1, NULL, mythread, "A"); 
    Pthread_create(&p2, NULL, mythread, "B"); 
    // join waits for the threads to finish 
    //Pthread_join(p1, NULL); 
    //Pthread_join(p2, NULL); 
    printf("main: end\n"); 
    return 0; 
} 

這是一個來自Remzi的代碼第27章玩耍,我很想知道爲什麼有時在運行時,我會打印兩次。我知道爲什麼會發生這種情況,因爲我沒有包含聯合聲明。爲什麼要跳過連接造成這種情況?當pthread_join被註釋時會發生什麼?

我的輸出:

[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
A 
main: end 
B 
[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
A 
main: end 
B 
[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
main: end 
A 
[email protected]:~/OS/Code-Threads-Intro$ ./a.out 
main: begin 
main: end 
B 
A 
A 
+1

請修正您的代碼中的編譯器錯誤,並刪除對非提供的「mythreads.h」頭的依賴。 – o11c

+1

大寫的函數名稱是否覆蓋函數名稱的所有小寫版本的函數,除非它們執行某種錯誤處理並可能報告?就目前而言,只有熟悉「mythreads.h」標題和圖書/課程資料的人才能夠提供幫助。我們可以做出(或多或少)受過教育的猜測,但我們不喜歡猜測。 –

+0

可能重複[pthread:一個printf語句在子線程中打印兩次](http://stackoverflow.com/questions/13550662/pthread-one-printf-statement-get-printed-twice-in-child-thread) –

回答

0

刪除通話pthread_join()應該不會造成 「A」 被打印兩次。 (禁止執行中的錯誤)

但由於您的fprintf()調用共享相同的FILE *結構,因此它們可能不是多線程安全的。他們如何以及爲什麼可以打印「A」兩次取決於系統的fprintf()函數的實現細節。

+0

感謝您加入見解。但我不認爲我明確地遵循你的答案。你說它由於printf()的實現缺陷而被打印了兩次? – FlyingAura

+0

是的。這是一個錯誤:https://sourceware.org/bugzilla/show_bug.cgi?id=14697 *這個錯誤是由於故意haibery在glibc中,以避免掛在退出()由於鎖被其他線程,在錯誤假設exit()「應該」在這種情況下立即退出。標準中沒有任何語言支持glibc正在做的事情。*另外:*看起來這個bug也會導致更嚴重的損壞,例如重複輸出,即使沒有任何明確的文件鎖定。 –

相關問題