2014-03-31 60 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(); 

儘管內存碎片可能會再次破壞一切。