2016-08-22 37 views
3

我正在嘗試一個簡單的程序來測試多線程。我只是在備用線程中打印一系列「x」和「O」。現在,如果我使用cout,屏幕上不會顯示任何輸出。如果我使用fputc並輸出到stderr,它可以正常工作。爲什麼cout(輸出到stdout)不在這裏工作?下面爲什麼cout不能與pthreads一起使用?

我的代碼給出:

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

using namespace std; 

static int count; 

void* print_xs(void *unused) 
{ 
    while(1) 
    { 
     if (count >=100) break; 
     if (count%2==0) 
     { 
      count++; 
      cout<<"X="; // no output here 
      fputc('X',stderr); // works ! 
     } 
     else 
     { 
      sleep(1); 
     } 
    } 
    return NULL; 

} 


int main() 
{ 
    pthread_t tid; 
    pthread_create(&tid,NULL,&print_xs, NULL); 

    while(1) 
    { 
     if (count >=100) break; 
     if (count%2!=0) 
     { 
      count++; 
      cout<<"O="; // no output here 
      fputc('O',stderr); // works ! 
     } 
     else 
     { 
      sleep(1); 
     } 
    } 

    pthread_join(tid,NULL); 
    return (0); 

} 
+6

你嘗試'沖洗''std :: cout'? – Jarod42

+1

請嘗試打印到'stdout'。 –

+2

@Nawaz std :: cout是線程安全的。 – Galik

回答

0

由於std::cout緩衝流,你需要flush它以緩衝發送到標準輸出。

剛剛嘗試類似:

cout<< "O="; 
cout.flush(); 

這應該工作。

其他注意事項

  1. 正如一些評論已經建議你,std::cout不是線程安全在C++ 03和之前。用mutex保護該對象可能很有用。 這可能不是問題,因爲C++ 11標準。

的FDIS說,以下在§27.4.1[iostream.objects.overview]:

併發訪問的同步(§27.5.3.4)標準iostream對象的格式和無格式輸入(§ 27.7.2.1)和輸出(第27.7.3.1節)函數或多線程的標準C流不應導致數據競爭(第1.10節)。 [注意:如果用戶希望避免交錯字符,用戶必須仍然同步使用這些對象和多個線程的流。 - 注完]

這意味着沒有互斥它保證的對象將不會在數據爭背景下損壞。但是重疊輸出的問題依然存在。所以如果你確定每行都被打印出來而沒有被另一個線程重疊,你仍然需要一個互斥鎖。

  • C++ 11具有引入了多線程庫(通常爲並行線程的包裝)。 Here some reference。只要看看,你會發現它很有用。
  • +0

    謝謝,但我不明白爲什麼只有在使用線程時這是一個問題?當我正常使用cout時,它在stdout上正確顯示。 – vinit

    +0

    這是不正確的。即使在單線程中,你也會得到這種行爲。我想你從來沒有注意到這一點。我剛剛寫了一個簡單的代碼,它打印了10次字符串(*沒有'\ n' *):'for(...)std :: cout <<「something」;'後面跟着一個調試器,直到節目結束。 (您也可以嘗試,但取決於特定的實現)。如果你需要,我也可以修改我的答案,並告訴你這種行爲。 –

    +0

    @vinit我忘了給你加標籤:) –

    相關問題