2013-03-17 84 views
0

我已經將3個任務並行放置:打印最小值,最大值和兩個數字的平均值。第一個任務打印最小值兩次,我期望它的輸出是連續的。C++中parallel_invoke的意外輸出

int wmain() 
{ 

__int64 elapsed; 

    elapsed = time_call([&] 
    { 
     double a = 1.0; 
     double b = 5.0; 
     parallel_invoke(
      [&]{for(size_t i = 0; i < 2; ++i) 
       { 
        PrintMinValue(a, b); 
       }}, 
      [&]{PrintMaxValue(a, b);}, 
      [&]{PrintAvgValue(a, b);}); 

    }); 

    wcout << L"parallel time: " << elapsed << L" ms" << endl << endl; 
} 

我跑了這個程序幾次。 所有輸出如5,3,1,1或3,1,1,5是可以理解的。 但是,一些輸出如1,5,3,1並不明顯。這意味着必須在連續塊中打印兩次「1」(最小值)的第一個任務被拆分。爲什麼?

回答

0

如果你想打印一整行沒有中斷使用printf風格的輸出,每次調用wcout或cout都可以在'< <'操作符處拆分。

+0

「打印」只是一個例子。例如,您可以使用任務。結果將是相同的。 – 2013-03-18 17:15:50

0

該代碼並行執行。爲什麼你預計塊是連續的?關於並行編程的全部觀點是你提供了這個保證 - 否則它不會平行,而是順序的。

如果您想保留執行順序,那麼您需要將您的連續塊包裝在critical section中。

+0

我的觀點是,這裏有3個任務並行,而不是4個! – 2013-03-18 17:12:57

+0

@EugeneZak絕對沒有改變。您的代碼確保的**唯一的事情是,* first *塊中的指令不會同時執行,而是按順序執行。但是他們與其他指令的關係沒有定義。這是並行執行的重點。 – 2013-03-18 17:14:15

+0

謝謝,這是有道理的。 – 2013-03-18 17:38:02