2012-01-10 11 views
0

私は最近、マルチスレッドについて知りたいと思っていました。次の予期せぬことに遭遇しました。少なくとも単純なコードで呼び出されたときにprintfは一度に1行以上を出力しません。これは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); 
    } 

出力は

test prompt$] 

このコードの何が問題になっている(10秒待ってから)

のですか?どうして私は一度に2行を印刷するprintfを得ることができないのですか? flockfileでstdoutをブロックし、funlockfileでロックを解除すると状況が改善されることはありません。

+0

あなたは 'volatile'と' buffer'を宣言していませんが、これは役に立たないでしょう。 –

+4

'printf()'を呼び出すたびに 'fflush(stdout);'を実行して、それが変更されるかどうか確認できますか? –

+0

これをコンパイルするために必要な '#include 'が含まれていれば、非常に尋ねられる質問になるでしょう。 – Flexo

答えて

2

プログラムの末尾にtest prompt$]と表示された場合は、実行したバージョンに"test %s\n test\n"の2番目の改行が含まれていないことを意味します。

改行は、出力が画面にフラッシュされるときに重要なので、重要です。説明と推奨事項については、Why does printf not flush after the call unless a newline is in the format string?を参照してください。

質問から正確なコードを再コンパイルして再実行してみてください。予想どおりに機能すると思います(確かに私の箱にあります)。

+0

実際、彼の質問から*正確なコード*はコンパイルされません。少なくとも1つの '#include 'がありません。 –

+0

Thak you much。それについて知らなかったし、すぐに文字列が印刷されることを期待しました。ありがとうございました。 –

関連する問題