2015-09-25 55 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可以避免额外的努力。