2010-12-16 83 views
2

我是OpenMP中的完全noob,剛開始時通過探索下面的一些簡單測試腳本。OpenMP C和C++ cout/printf不提供相同的輸出

#pragma omp parallel 
    { 
     #pragma omp for 
      for(int i=0;i<10;++i) 
      std::cout<<i<<" "<<endl; 
     // printf("%d \n",i); 
    } 
} 

我試過C和C++版本,C版本似乎工作正常,而C++版本給我一個錯誤的輸出。

+1

更具體的是什麼是輸出和你的期望(雖然我認爲我可以在這種情況下推測後者)。 – 2010-12-16 10:55:25

回答

5

printf的許多實現獲取鎖以確保每個printf調用不被其他線程中斷。

相反,std::cout的重載<<操作者表示(即使有鎖)的i' ''\n'一個線程的印刷可以與另一個線程的輸出進行交織,因爲std::cout<<i<<" "<<endl;被轉換成由C 3 operator<<()函數調用++編譯器。

0

這是過時的,但也許這可能是還幫助任何人:

這不是真的清楚你期望的輸出爲,但要注意的是什麼:

  1. 你的變量「i」可能在線程中共享。你對「我」的內容有競爭條件。當一個線程想要訪問「我」時需要等待另一個線程。另外一個線程可以改變「我」,另一個線程不會記錄它,這意味着它會輸出一個錯誤的值。

  2. endl()在結束該行後刷新內存。如果你使用\ n作爲換行符,效果是類似的,但沒有刷新。 std也是一個對象,所以多個線程競爭std訪問。當每次訪問後內存不刷新時,您可能會遇到干擾。

爲了確保這些與您的問題無關,您可以將「我」聲明爲私有,因此每個線程都計算「我」本身。你可以在輸出時刷新內存,看看它是否與你遇到的問題有關。

相關問題