0

我已经并行执行了 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”(最小值)的第一个任务被拆分。为什么?

4

2 回答 2

0

代码是并行执行的。为什么你期望块是连续的?关于并行编程的全部意义在于你放弃了这个保证——否则它不会是并行的,而是顺序的。

如果要保留执行顺序,则需要将连续块包装在关键部分中。

于 2013-03-17T20:49:43.980 回答
0

对 wcout 或 cout 的每次调用都可以在 '<<' 运算符处拆分,如果要打印整行而不中断,请使用 printf 样式输出。

于 2013-03-17T20:38:56.073 回答