我在我的一个应用程序中使用并行 for,其中包含如下所示的循环。我的理解是,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 到 51b
迭代并从51 迭代a + 1
,count[c] 的值应该是 1326 [(n*n+1)/2 where n = 51] 每次?但它不是。事实上,每次我得到一个随机计数......但如果我printf("%d,", a);
神奇地取消注释第一个 printf 语句,输出是否被纠正?我该如何纠正?我怀疑这有一些我没有解决的同步问题,并且 printf 语句通过引入任意等待时间以某种方式解决。
处理/使用 parallel_for 循环的正确方法是什么?
解决
了第二个迭代循环变量b
的作用域在 main 中,因为它应该在每个线程中局部作用域,在第二个循环中声明变量可以解决问题,但这并没有说明为什么在循环中添加 printf 可以解决问题,a
尽管它b
范围不正确并遇到竞争状况
更正代码如下
使用命名空间并发;使用命名空间标准;
#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();
}