2011-11-14 19 views
0

時々、C++は大きな時間を費やす。私は本当にこれがなぜ機能しないのか考えることができず、あなたが知っていれば幸せになるでしょう。奇妙なリストの印刷機能の動作。もし私が " n"を印刷しても、それを取り除くとうまくいかない。

私はこの関数を1秒に1回スレッドで呼び出します。

このコードは、作品は(反復されているリストの上にあるものを出力します):

void DeltaList::print() 
{ 
    pthread_mutex_lock (&mutex); 
    printf("\n"); 
    list<Delta*>::iterator it; 
    for(it=deltas.begin(); it!=deltas.end(); it++) 
    { 
    printf("%d ", (int) (*it)->timeleft); 
    } 

    pthread_mutex_unlock (&mutex); 
} 

この1つは(何も印刷されません)していません。だから、

void DeltaList::print() 
{ 
    pthread_mutex_lock (&mutex); 
    //printf("\n"); 
    list<Delta*>::iterator it; 
    for(it=deltas.begin(); it!=deltas.end(); it++) 
    { 
    printf("%d ", (int) (*it)->timeleft); 
    } 

    pthread_mutex_unlock (&mutex); 
} 

...?

+4

「作品」を定義します。 –

+0

WORKS =実際にリストにあるものを印刷します。動作しません=何もしません、何も印刷されません。 printfは私が変更するコードの唯一の部分です。これは私にはとても論理的で、質問をするのを忘れて、今編集しました。 – hfingler

+0

それは永遠にブロックされますか?つまり、これまでに機能を残していますか? –

答えて

3

これはスレッドまたはC++とは関係ありません。 OSは出力をバッファリングしており、はstdoutがコンソールであるときに暗黙的にバッファをフラッシュします。すべての呼び出しですぐに出力を表示する場合は、ループの後にfflush(stdout)を呼び出します。

+0

私はこのことを決して考えていません。すぐに質問したいと思います。私はあまりにも多くの文字を(メモリサイズと言って)標準出力と '\ n'に印刷するとどうなりますか? – hfingler

+0

バッファはいっぱいになるとフラッシュされます。 – bames53

+0

'stdout'も' exit() 'の呼び出し時や' main'からの戻り時にフラッシュされるので、データは最終的に出力されるはずです。 –

0

は私がSTDOUTがバッファリングされているためだと思う、と印刷\ n個のバッファをフラッシュする - 実験としてのstd :: CERRを使用してSO on printf \n behaviour

0

スイッチを介して参照し、私はそれが標準のため、細かいたびに出力することを賭けるだろうcout/printf(標準出力)がバッファされている間、エラーはバッファされません。終わりにstd :: endlを置くと、flushがバッファされ、coutのために新しい行が出力されます。あなたは単に標準出力に取り組み、ストリーム上でフラッシュ機能を呼び出して、それが似ているコンソールに出力されるようにすることもできます。

関連する問題