Я использую параллель для в одном из моих приложений, который содержит цикл, как показано ниже. Насколько я понимаю, цикл 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
было определено в main, где, как и должно было быть определено локально в каждом потоке, объявление переменной во втором цикле решает проблему, но это не объясняет, почему добавление 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();
}
Задача ещё не решена.
Других решений пока нет …