Я использую параллель в одном из моих приложений, которое содержит цикл, как показано ниже.Насколько я понимаю, цикл Parallel_for будет выполнять итерацию по всему диапазону, но не обязательно в последовательном порядке, но он будет проходить и по всему всему диапазону , тем не менее, я получаю противоречивые результаты для простого подсчета.
using namespace concurrency;
using namespace std;
#include <ppl.h>
#include <Windows.h>
#include <array>
#include <stdio.h>
int main()
{
combinable<DWORD64> count[10];
int b, c;
for (c = 0; c < 10; c++)
{
parallel_for(0, 52, [&](int a)
{
//printf("%d,", a);
for (b = a + 1; b < 52; b++)
{
count[c].local()++;
}
});
printf("\n%llu\n", count[c].combine(plus<DWORD64>()));
}
getchar();
}
, учитывая, что a
повторяется от 0 до 51, а b
повторяется от a + 1
до 51, значение count [c] должно быть 1326 [(n * n + 1) / 2, где n =51] каждый раз?но это не так.Фактически, каждый раз, когда я получаю случайный счет ... но если я откомментирую первый оператор printf printf("%d,", a);
волшебным образом, результат будет исправлен?Как я могу исправить это?Я подозреваю, что у этого есть некоторая проблема синхронизации, которую я не решаю, и оператор printf каким-то образом решает, вводя произвольное время ожидания.
Как правильно обрабатывать / использовать циклы parallel_for?
решено вторая переменная итеративного цикла b
была определена в основном, где, как и должна быть локально определена область в каждом потоке, объявление переменной во втором цикле решает проблему, но это не объясняет, почему добавлениецикл printf в a
устранил проблему, несмотря на то, что b
неправильно определен и имеет состояние гонки
Исправлен код ниже
с использованием параллелизма пространства имен;используя пространство имен std;
#include <ppl.h>
#include <Windows.h>
#include <array>
#include <stdio.h>
int main()
{
combinable<DWORD64> count[10];
int c;
for (c = 0; c < 10; c++)
{
parallel_for(0, 52, [&](int a)
{
//printf("%d,", a);
for (int b = a + 1; b < 52; b++)
{
count[c].local()++;
}
});
printf("\n%llu\n", count[c].combine(plus<DWORD64>()));
}
getchar();
}