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» (минимальное значение) дважды в непрерывный блок, разбивается. Зачем?

0

Решение

каждый вызов wcout или cout может быть разделен на ‘<<‘оператор, если вы хотите напечатать всю строку без разрывов, используйте вывод в стиле printf.

0

Другие решения

Код выполняется параллельно. Почему ты ожидать блоки должны быть смежными? Весь смысл параллельного программирования в том, что вы отказываетесь от этой гарантии — иначе она не будет параллельной, а последовательной.

Если вы хотите сохранить последовательность выполнения, вам нужно обернуть свой непрерывный блок в критическая секция.

0

По вопросам рекламы [email protected]