Я поставил 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» (минимальное значение) дважды в непрерывный блок, разбивается. Зачем?
каждый вызов wcout или cout может быть разделен на ‘<<‘оператор, если вы хотите напечатать всю строку без разрывов, используйте вывод в стиле printf.
Код выполняется параллельно. Почему ты ожидать блоки должны быть смежными? Весь смысл параллельного программирования в том, что вы отказываетесь от этой гарантии — иначе она не будет параллельной, а последовательной.
Если вы хотите сохранить последовательность выполнения, вам нужно обернуть свой непрерывный блок в критическая секция.