并发:: parallel_for每次迭代次数不一致

时间:2018-06-04 10:59:52

标签: c++ loops parallel-for

我在我的一个应用程序中使用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迭代,ba + 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

0 个答案:

没有答案