C ++中parallel_invoke的意外输出

时间:2013-03-17 18:25:27

标签: c++ ppl

我已经并行放置了3​​个任务:打印最小值,最大值和两个数字的平均值。第一个任务打印最小值两次,我希望它的输出是连续的。

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 个答案:

答案 0 :(得分:0)

每次调用wcout或cout都可以在'&lt;&lt;'分开运算符,如果要打印整行而不中断使用printf样式输出。

答案 1 :(得分:0)

代码并行执行。为什么期望块是连续的?关于并行编程的重点是你要保证这一点 - 否则它不会是并行的而是顺序的。

如果要保留执行顺序,则需要将连续的块包装在critical section中。