Class parallel_for / parallel_for_each 内部或外部的对象?

Class object inside or outside a parallel_for / parallel_for_each?

我一直在研究并行循环 (C++11) 并使用 MS visual studio 2013 对其进行测试。我很清楚它们(lambdas esp.)非常酷。

但我担心的是我必须调用一个执行简单欧氏距离测量的函数。函数本身很清楚,但我必须将函数移动到名为 EuclideanDistance 的 class 并在函数 Match(vectorA,vectorB ) 在两个向量上,这只是一些范数(...) calculation.And returns 一个浮点值。

现在我该如何在 parallel_for/parallel_foreach 循环中处理这个问题?我是在循环内创建 class 对象还是在循环外保留 class 对象会导致不一致?如果我对并行循环的理解正确,那么它运行的函数基本上是每个启动线程的干净副本。 class 函数会发生这种情况吗?我的直觉是不!除非我在 class 中创建一个对象,如第二个代码片段所示。

例如 为了便于阅读,我保留了代码的缩写。

vectorA; // Floating point array of 1024 entries.
concurrent_queue vectorQ; // each entry in the queue is a 1024 array
EuclideanDistance euclid;
parallel_for_each(begin,end,[&](auto item)
{
    auto distance = euclid.Match(vectorA,item);
});

或者这才是正确的做法?

parallel_for_each(begin,end,[&](auto item)
{
EuclideanDistance euclid;
    auto distance = euclid.Match(vectorA,item);
});

整个class只不过是一个函数而已。

    class EuclideanDistance
    {
public:
       float Match(vectorA,vectorB)
        {
           return norm(vectorA,vectorB); 
        }
    };

任何陷阱将不胜感激!

你是正确的,如果你在 parallel_for_each lambda 主体之外定义你的 EuclideanDistance 对象,它将在执行 parallel_for_each 的所有工作线程之间共享。如果你的 Match() 函数有副作用影响你的 EuclideanDistance 对象中的共享状态,这将是一个问题,但在这种情况下,它可能会在 lambda 中定义对象(这将给出循环体的每次执行它自己的本地实例)与在外部定义它会有不同的结果。

只要您在 EuclideanDistance 对象上调用的任何函数没有副作用/不修改共享状态,那么您就可以使用在 lambda 之外定义的一个对象。如果您调用的函数有副作用,那么您需要自己进行同步,这可能会显着影响 parallel_for_each 的性能增益。