0

2 つの数値の最小値、最大値、平均値を出力する 3 つのタスクを並行して配置しました。最初のタスクは最小値を 2 回出力しますが、出力は連続していると思います。

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" (最小値) を 2 回出力する必要がある最初のタスクが分割されることを意味します。なんで?

4

2 に答える 2

0

wcoutまたはcoutへのすべての呼び出しは、'<<'演算子で分割できます。途切れることなく行全体を印刷する場合は、printfスタイルの出力を使用します。

于 2013-03-17T20:38:56.073 に答える
0

コードは並行して実行されます。ブロックが連続していると予想されるのはなぜですか? 並列プログラミングの要点は、この保証を放棄することです。そうしないと、並列ではなく順次になります。

実行の順序を保持したい場合は、隣接するブロックをクリティカル セクションでラップする必要があります。

于 2013-03-17T20:49:43.980 に答える