线程本地存储:如何组合值?

Thread Local Storage: How to combine values?

我有一个 parallel_for 循环:

tbb::parallel_for(tbb::blocked_range<int>(0, numVerts, 1 /* Grain Size */),
                  [&](tbb::blocked_range<int> r) {
                    thread_local vector<int> V;
                    for (int i = r.begin(); i < r.end(); ++i) {
                    ... (some work changing values in V)
                    }
                  }

并且我想在并行工作完成后“组合”这些值,但是如何呢?有办法吗?

根据定义,线程本地存储对于每个线程都是本地的。与任何其他局部变量一样,跨线程访问它的唯一方法是传递指针。

但在这种情况下您不需要这样做(您也不需要 thread_local)。你知道你需要多少个向量,所以你应该在调用 parallel_for() 之前分配一个向量数组,让 lambda 迭代 blocked_range 根据需要按索引填充每个向量。 parallel_for 完成后,您可以迭代数组以收集结果。

vector<vector<int>> V(numVerts);

tbb::parallel_for(tbb::blocked_range<int>(0, numVerts, 1 /* Grain Size */),
    [&](tbb::blocked_range<int> r) {
        for (int i = r.begin(); i < r.end(); ++i) {
            // some work changing values in V[i] ...
        }
    }
);

// use V as needed...