2013-04-10 57 views
3

我正在用pthread_create創建線程。爲什麼fprintf不能在線程中工作?

裏面的線程函數我使用

fprintf(stdout, "text\n"); 

但這並不輸出任何東西到控制檯。同樣的問題與printf。 我也嘗試刷新標準輸出緩衝沒有任何成功。 所以問題是如何從線程打印任何東西到控制檯?

UPD:

void *listen_t(void *arg){ 
    fprintf(stdout, "test\n"); 
    fflush(stdout); 
} 

int main(int argc, char **argv){ 
    pthread_t tid; 
    int err; 

    err = pthread_create(&tid, NULL, &listen_t, &thread_params); 
    if (err != 0){ 
    printf("\ncan't create thread :[%s]", strerror(err)); 
    } 
    else{ 
    printf("\n Thread created successfully\n"); 
    } 
    return 0; 
} 

的代碼主要工作正常。但線程不輸出任何東西

+0

請告訴我們,證明了問題的最小完整的例子。 – NPE 2013-04-10 17:46:33

+0

線程是否運行分離?如果是這樣,那麼就沒有STDOUT了。 – 2013-04-10 17:46:40

+0

你如何將'stdout'傳遞給線程? – dasblinkenlight 2013-04-10 17:47:05

回答

4

您錯過了pthread_join的調用:如果主程序在printf的輸出到達控制檯之前退出,則看不到任何內容。

添加pthread_join(tid, NULL);您例如固定輸出:

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

void *listen_t(void *arg){ 
    fprintf(stdout, "test\n"); 
    fflush(stdout); 
} 

int main(int argc, char **argv){ 
    pthread_t tid; 
    int err; 

    err = pthread_create(&tid, NULL, &listen_t, NULL); 
    if (err != 0){ 
    printf("\ncan't create thread :[%d]", strerror(err)); 
    } 
    else{ 
    printf("\n Thread created successfully\n"); 
    } 
    pthread_join(tid, NULL); 
    return 0; 
} 
+0

耶!這工作。謝謝! – RomanKapitonov 2013-04-10 17:56:10

+2

只需要注意,您也應該在此處使用互斥鎖,並在打印到控制檯時鎖定(以防打印多個線程時)。 – ZarakiKenpachi 2013-04-10 18:02:27

+1

@ZarakiKenpachi:stdio有內部鎖定。不需要另一層鎖。 – 2013-04-10 18:06:05

相關問題