2015-09-25 37 views
0

因此,tbb vector允許獲得開始指針和長度(大小)。那麼我們可以安全地假設我們可以從開始迭代到開始+長度而不需要鎖定?或者我們如何將指針內容傳遞給接受開始指針和長度的C風格函數?我們是否應該提供鎖定,只有從矢量中移除元素,併發增長是可以接受的?TBB併發向量是否支持舊的c風格循環?

現實生活中的問題:指向zmqsockets的指針併發向量越來越小。帶有zmq輪詢的線程,提供C風格的迭代。

回答

2

tbb::concurrent_vector<>不表示用於存儲其元素的連續數組/存儲區域。請注意文檔中的Fragmentation部分:

與std :: vector不同,concurrent_vector在增長時不會移動現有元素。容器分配一系列連續的數組。 ...

blog可視化concurrent_vector的結構,如果你考慮到內存段被單獨分配,並可以在內存不連續的地址:

concurrent_vector structure

所以,

如何將指針內容傳遞給接受開始指針和長度的C風格函數

是你不能這樣做,因爲沒有保證所有元素的連續內存(除非你決定分別處理每個段)。

可以使用迭代器或[]運營商看起來完全一樣的C風格的循環通過concurrent_vector迭代:

for(i = 0; i < conc_vec.size(); i++) 
    printf(" %d", conc_vec[i]) 

但在這同時增加了矢量其他線程的存在,它是安全只有當你知道矢量的安全大小,其中所有元素已經構建完成。在該博客中建議使用tbb::zero_allocator可以避免額外的努力。