2014-03-31 32 views
2

我有多个大英特尔TBB concurrent_vectors,我需要合并。它们太大以至于无法分配足够大小的新concurrent_vector。连接tbb concurrent_vectors?

......所以,下面的伪代码将无法正常工作

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(),但我看不到如何交换或追加倍数。任何人都可以将我指向正确的方向吗?提前致谢!!

回答

4

不幸的是,没有这样的方法可以将多个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(); 

尽管内存碎片可能会再次破坏一切。