2012-01-10 125 views
0

我最近努力學習多線程,並遇到以下意外 - 至少對我來說 - 行爲:printf在一次非常簡單的代碼中不會打印超過一行:這是一個printf()/ pthread錯誤,還是我錯過了什麼?

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
    char buffer[2]; 

    void * thread_routine(void * args){ 
     pthread_mutex_lock(&mutex); 
     pthread_cond_wait(&cond, &mutex); 
     printf("test %s\n test\n", buffer); 
     pthread_mutex_unlock(&mutex); 
     return(NULL); 
    } 

    int main(void){ 
     pthread_t thread; 
     pthread_create(&thread, NULL, thread_routine, NULL); 
     sleep(1); 
     buffer[0] = 'c'; 
     buffer[1] = '\0'; 
     pthread_mutex_lock(&mutex); 
     pthread_cond_signal(&cond); 
     pthread_mutex_unlock(&mutex); 
     sleep(10); 
     return(0); 
    } 

輸出是

(等待10秒)

test prompt$] 

什麼是錯的代碼?我怎麼無法讓printf一次打印兩行?請注意,使用flockfile阻止stdout並使用funlockfile解鎖不會改善情況。

+0

你還沒有將'buffer'聲明爲'volatile',這不會有幫助。 – 2012-01-10 15:51:23

+4

你可以試着在每次調用printf()後運行'fflush(stdout);'看看是否改變了事情? – 2012-01-10 15:51:58

+0

如果你包含'#include's需要編譯它,這將是一個出色的問題 – Flexo 2012-01-10 15:52:57

回答

2

如果您的程序在最後打印test prompt$]如您所說,這意味着您執行的版本沒有"test %s\n test\n"中的第二個換行符。

換行符很重要,因爲這是當輸出被刷新到屏幕上時。請參閱Why does printf not flush after the call unless a newline is in the format string?以獲得解釋和建議。

嘗試重新編譯並重新運行您的問題中的確切代碼,我敢打賭它會像預期的那樣工作(它確實在我的盒子上)。

+0

其實,他的問題中的*確切代碼*不會被編譯。它缺少至少一個'#include'。 – 2012-01-10 16:00:02

+0

非常感謝。不知道這一點,並預期該字符串將被立即打印。謝謝。 – 2012-01-10 16:10:57

相關問題