【问题标题】:Concatenate tbb concurrent_vectors?连接 tbb concurrent_vectors?
【发布时间】:2014-03-31 20:15:10
【问题描述】:

我有多个需要合并的大型 Intel TBB concurrent_vector。它们太大了,无法分配足够大小的新 concurrent_vector。

...所以下面的伪代码不起作用

concurrent_vector<myStruct> A(100000);
concurrent_vector<myStruct> B(100000);
...
concurrent_vector<myStruct> X(100000);

concurrent_vector<myStruct> combined;
combined.resize(A.size()+B.size()....X.size()); // This will fail

我想做的是将第一组向量转移或交换到组合向量中,以便 [A]、[B]...[X] 变为 [AB...X]。我知道 tbb 支持单个向量的 swap(),但我看不到如何交换或附加多个向量。谁能指出我正确的方向?提前致谢!!

【问题讨论】:

    标签: c++ multithreading memory-management tbb concurrent-vector


    【解决方案1】:

    不幸的是,没有这样一种方法可以将多个 concurrent_vector 组合成一个而不重新分配。它来自于 tbb::concurrent_vector 严格的数据结构规则,其中每个元素段的大小必须与之前所有段的总和大小相同。

    但请记住,concurrent_vector 会在没有重新分配的情况下增长,因此您能做的最好的事情就是一个接一个地附加向量,在复制后立即销毁它们。这样,在需要时就有更多机会释放足够大的内存块。

    std::copy(B.begin(), B.end(), A.grow_by(B.size())); B.clear();
    std::copy(C.begin(), C.end(), A.grow_by(C.size())); C.clear();
    ...
    std::copy(X.begin(), X.end(), A.grow_by(X.size())); // X.clear();
    

    不过,内存碎片会再次毁掉一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2020-07-30
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多