2014-03-07 33 views
1
#include "apue.h"                
#include <limits.h> 
#include <pthread.h> 


void* fun(void *arg) 
{ 
    printf("%lu: I'm alive\n", pthread_self()); 
    pthread_exit(0); 
} 

int main(int argc, char **v) 
{ 
    pthread_t tid; 
    pthread_create(&tid, NULL, fun, NULL); 
    printf("%lu: I'm dead\n", pthread_self()); 

    return 0; 
} 


Pthread I/O緩衝區:爲什麼打印冗餘行?

$ ./a.out 
3075692224: I'm dead 
3075689280: I'm alive 
3075689280: I'm alive 

$ ./a.out 
3076470464: I'm dead 

Somtimes,它打印一條線。 我覺得 一行:3076470464: I'm dead 或 兩行:

3075692224: I'm dead 
3075689280: I'm alive 

應rigjt。 因爲我不使用pthread_join,但爲什麼它可以打印三行;

+0

正確退出你的線程,你的輸出應該沒問題。目前代碼產生未定義的行爲。 – this

+0

有時候,解決問題比理解它發生的原因要容易得多。 –

回答

2

您可觀察到未受保護的共享資源併發訪問的奧祕,即在此情況下緩衝的stdout

使用互斥鎖來保護stdout免遭併發訪問,並且所有內容都將按預期工作:一個printf()語句將匹配一個打印行。

但是,你的程序存在風險,main()在線程結束之前退出,結束程序可能會在隨機位置銷燬線程。