我在我的一个应用程序中使用parallel,其中包含如下所示的循环。我的理解是parallel_for循环将迭代整个范围,但不一定按顺序迭代,但它将遍历整个范围,但是我得到的结果不一致,简单计数。 / p>
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 {1}}修复了问题,尽管a
的范围不正确且遇到竞争条件
更正以下代码
使用命名空间并发; 使用namespace std;
b