TBB 并发向量是否支持旧的 C 风格循环?

Does TBB concurrent vector support old c style loops?

所以 tbb vector 允许获取开始指针和长度(大小)。那么我们可以安全地假设我们可以在不加锁的情况下从 begin 迭代到 begin+length 吗?或者我们如何将指针内容传递给接受开始指针和长度的 C 风格函数?我们是否应该只在从 vector 中删除元素时提供锁并且并发增长是可以接受的?

现实生活中的问题:指向 zmqsockets 的指针的并发向量同时变大和变小。提供 C 风格迭代的带 zmq poll 的线程。

tbb::concurrent_vector<> 不代表用于存储其元素的连续 array/memory 区域。请注意文档中的 Fragmentation 部分:

Unlike a std::vector, a concurrent_vector never moves existing elements when it grows. The container allocates a series of contiguous arrays. ...

这个blog可视化了concurrent_vector的结构,如果你考虑到内存段是单独分配的,并且在内存中可以有不连续的地址:

所以,

的答案

how can we pass pointer contents to C style function that accepts begin pointer and length

你不能这样做,因为不能保证所有元素的连续内存(除非你决定单独处理每个段)。

您可以使用迭代器或 [] 运算符遍历 concurrent_vector,这看起来与 C 风格的循环完全一样:

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

但是在存在同时增长向量的其他线程的情况下,只有当您知道已经构建了所有元素的向量的安全大小时,它才是安全的。可以通过额外的努力和使用该博客中建议的 tbb::zero_allocator 来避免锁定。