因此,tbb vector允許獲得開始指針和長度(大小)。那麼我們可以安全地假設我們可以從開始迭代到開始+長度而不需要鎖定?或者我們如何將指針內容傳遞給接受開始指針和長度的C風格函數?我們是否應該提供鎖定,只有從矢量中移除元素,併發增長是可以接受的?TBB併發向量是否支持舊的c風格循環?
現實生活中的問題:指向zmqsockets的指針併發向量越來越小。帶有zmq輪詢的線程,提供C風格的迭代。
因此,tbb vector允許獲得開始指針和長度(大小)。那麼我們可以安全地假設我們可以從開始迭代到開始+長度而不需要鎖定?或者我們如何將指針內容傳遞給接受開始指針和長度的C風格函數?我們是否應該提供鎖定,只有從矢量中移除元素,併發增長是可以接受的?TBB併發向量是否支持舊的c風格循環?
現實生活中的問題:指向zmqsockets的指針併發向量越來越小。帶有zmq輪詢的線程,提供C風格的迭代。
tbb::concurrent_vector<>
不表示用於存儲其元素的連續數組/存儲區域。請注意文檔中的Fragmentation
部分:
與std :: vector不同,concurrent_vector在增長時不會移動現有元素。容器分配一系列連續的數組。 ...
這blog可視化concurrent_vector
的結構,如果你考慮到內存段被單獨分配,並可以在內存不連續的地址:
所以,
如何將指針內容傳遞給接受開始指針和長度的C風格函數
是你不能這樣做,因爲沒有保證所有元素的連續內存(除非你決定分別處理每個段)。
可以使用迭代器或[]
運營商看起來完全一樣的C風格的循環通過concurrent_vector迭代:
for(i = 0; i < conc_vec.size(); i++)
printf(" %d", conc_vec[i])
但在這同時增加了矢量其他線程的存在,它是安全只有當你知道矢量的安全大小,其中所有元素已經構建完成。在該博客中建議使用tbb::zero_allocator
可以避免額外的努力。