1

我在我的一个应用程序中使用并行 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();
}
4

0 回答 0