2013-10-11 63 views
1

假設我有這樣的代碼,例如:標準輸出順序多線程

main() { 
    start thread; 
    put data in task queue; 
    do some stuff 
    wait for data in result queue; 
    printf ("main got result\n"); 
    fflush(stdout); 
} 

thread() { 
    while (!done) { 
     wait for data in task queue; 
     printf ("thread finished processing\n"); 
     fflush(stdout); 
     put data in result queue; 
    } 
} 

是否有可能得到這樣的輸出以下,如果我的線程安全的數據隊列是否工作正常?

main got result 
thread finished processing 

stdio是否可以像這樣重新排序,或者確實表明我的「線程安全」隊列不是?

如果我正在用C++編譯並在上面的代碼中的main(「仍然使用printf」)中的「do some stuff」部分使用iostreams,答案會改變嗎?

+0

這種重新排序不太可能發生,但它可能取決於實現。在將數據添加到結果隊列之前,您正在打印並刷新線程中的stdout。這是一種模式,假設你在隊列中有一些同步問題。 –

+0

就我而言,這確實是由於我誤解了什麼情況會導致「等待隊列中的數據」提前解鎖而引起的。修改該函數的返回值檢查修復了該問題。謝謝你們,你們把我放在正確的軌道上來調試問題。 – pavon

回答

1

沒有。

即使你正在異步運行兩個線程(我不知道你是否在這裏),在每個線程內命令按順序執行。

因此,你的線程()會首先打印「花紋處理完成」,然後將數據放入結果隊列中。只有這樣你的main()纔會得到消息並打印出「主要獲得的結果」。

+0

好的。這是我從多年的C編程中瞭解到的,但我已經看到各種奇怪的混合iostream和stdio,並且仍然不完全相信我理解這兩者之間的緩衝/同步。 – pavon

+0

我只是從經驗中發言。我想不出任何可能的方式來交換兩個產出。但誰知道,一些奇怪的情況可能會發生。 –